/ Hex Artifact Content
Login

Artifact d6e9edb629d43a7762882fe2e2950886cdb95606:


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 23  p processes */.#
4b10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4b20: 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57  IT_WAL.  Wal *pW
4b30: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
4b40: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68       /* Write-ah
4b50: 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20  ead log used by 
4b60: 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61  "journal_mode=wa
4b70: 6c 22 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  l" */.#endif.};.
4b80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
4b90: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
4ba0: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
4bb0: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
4bc0: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
4bd0: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
4be0: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
4bf0: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
4c00: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
4c10: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
4c20: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
4c30: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
4c40: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
4c50: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
4c60: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
4c70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4c80: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
4c90: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
4ca0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
4cb0: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
4cc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
4cd0: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
4ce0: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
4cf0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
4d00: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
4d10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
4d20: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
4d30: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66  journal */.# def
4d40: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
4d50: 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  v++.#else.# d
4d60: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
4d70: 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a  (v).#endif..../*
4d80: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
4d90: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
4da0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
4db0: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
4dc0: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
4dd0: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
4de0: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
4df0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
4e00: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
4e10: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
4e20: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
4e30: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
4e40: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
4e50: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
4e60: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
4e70: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
4e80: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
4e90: 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69   is being.** wri
4ea0: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
4eb0: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
4ec0: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
4ed0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
4ee0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
4ef0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
4f00: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
4f10: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
4f20: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
4f30: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
4f40: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
4f50: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
4f60: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
4f70: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
4f80: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
4f90: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
4fa0: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
4fb0: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
4fc0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
4fd0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
4fe0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
4ff0: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
5000: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
5010: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
5020: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
5030: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
5040: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
5050: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
5060: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
5070: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
5080: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
5090: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
50a0: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
50b0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
50c0: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
50d0: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
50e0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
50f0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
5100: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
5110: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
5120: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
5130: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
5140: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
5150: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
5160: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
5170: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
5180: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
5190: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
51a0: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
51b0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
51c0: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
51d0: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
51e0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
51f0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
5200: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
5210: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
5220: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
5230: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
5240: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
5250: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
5260: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
5270: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
5280: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
5290: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
52a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
52b0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
52c0: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
52d0: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
52e0: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
52f0: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
5300: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66  e size of the of
5310: 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72   each page recor
5320: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
5330: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
5340: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
5350: 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  cro..*/.#define 
5360: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
5370: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
5380: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
5390: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
53a0: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
53b0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  or this pager. T
53c0: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74  his is usually t
53d0: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65  he same .** size
53e0: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73   as a single dis
53f0: 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c  k sector. See al
5400: 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  so setSectorSize
5410: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ()..*/.#define J
5420: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5430: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
5440: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
5450: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
5460: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
5470: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
5480: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
5490: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
54a0: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
54b0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
54c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
54d0: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
54e0: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
54f0: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
5500: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
5510: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
5520: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
5530: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
5540: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
5550: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5560: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
5570: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
5580: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
5590: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
55a0: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
55b0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
55c0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
55d0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
55e0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
55f0: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
5600: 36 34 37 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  647..#ifndef NDE
5610: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BUG ./*.** Usage
5620: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
5630: 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
5640: 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
5650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73  */.static int as
5660: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
5670: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
5680: 0a 0a 20 20 2f 2a 20 41 20 74 65 6d 70 2d 66 69  ..  /* A temp-fi
5690: 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20  le is always in 
56a0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
56b0: 6f 72 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  or PAGER_SYNCED 
56c0: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65  state. */.  asse
56d0: 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
56e0: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  File==0 || pPage
56f0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
5700: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
5710: 2f 2a 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75  /* The changeCou
5720: 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61  ntDone flag is a
5730: 6c 77 61 79 73 20 73 65 74 20 66 6f 72 20 74 65  lways set for te
5740: 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73  mp-files */.  as
5750: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
5760: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
5770: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
5780: 44 6f 6e 65 20 29 3b 0a 0a 20 20 72 65 74 75 72  Done );..  retur
5790: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
57a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
57b0: 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73   if it is necess
57c0: 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67  ary to write pag
57d0: 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20  e *pPg into the 
57e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  sub-journal..** 
57f0: 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  A page needs to 
5800: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
5810: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
5820: 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
5830: 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f  one.** or more o
5840: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66  pen savepoints f
5850: 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20  or which:.**.** 
5860: 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d    * The page-num
5870: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
5880: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67   or equal to Pag
5890: 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69  erSavepoint.nOri
58a0: 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  g, and.**   * Th
58b0: 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
58c0: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ing to the page-
58d0: 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65  number is not se
58e0: 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65  t in.**     Page
58f0: 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
5900: 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  vepoint..*/.stat
5910: 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69  ic int subjRequi
5920: 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70  resPage(PgHdr *p
5930: 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  Pg){.  Pgno pgno
5940: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
5950: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
5960: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
5970: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5980: 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   i<pPager->nSave
5990: 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  point; i++){.   
59a0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
59b0: 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
59c0: 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20  avepoint[i];.   
59d0: 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70   if( p->nOrig>=p
59e0: 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  gno && 0==sqlite
59f0: 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70  3BitvecTest(p->p
5a00: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
5a10: 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  o) ){.      retu
5a20: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
5a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5a40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
5a50: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
5a60: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
5a70: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
5a80: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
5a90: 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a  nJournal(PgHdr *
5aa0: 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  pPg){.  return s
5ab0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
5ac0: 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49  (pPg->pPager->pI
5ad0: 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
5ae0: 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  gno);.}../*.** R
5af0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
5b00: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
5b10: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
5b20: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
5b30: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
5b40: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
5b50: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
5b60: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
5b70: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
5b80: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
5b90: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
5ba0: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
5bb0: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
5bc0: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
5bd0: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
5be0: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
5bf0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
5c00: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
5c10: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
5c20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
5c30: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
5c40: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
5c50: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
5c60: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
5c70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5c80: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
5c90: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
5ca0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5cb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
5cc0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
5cd0: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
5ce0: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
5cf0: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
5d00: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
5d10: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
5d20: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
5d30: 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72  *)A,B)../*.** Wr
5d40: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
5d50: 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69  eger into the gi
5d60: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
5d70: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tor.  Return SQL
5d80: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
5d90: 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
5da0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
5db0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
5dc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
5dd0: 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  te32bits(sqlite3
5de0: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
5df0: 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b  ffset, u32 val){
5e00: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
5e10: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
5e20: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
5e30: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
5e40: 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b   ac, 4, offset);
5e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
5e60: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
5e70: 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64  acro is a file d
5e80: 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65 20  escriptor (type 
5e90: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a  sqlite3_file*)..
5ea0: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
5eb0: 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  t is not open, o
5ec0: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20  r non-zero (but 
5ed0: 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e  not 1) if it is.
5ee0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
5ef0: 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  o that expressio
5f00: 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ns can be writte
5f10: 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  n as:.**.**   if
5f20: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
5f30: 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a  >jfd) ){ ....**.
5f40: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ** instead of.**
5f50: 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65 72  .**   if( pPager
5f60: 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
5f70: 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ){ ....*/.#defin
5f80: 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28  e isOpen(pFd) ((
5f90: 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  pFd)->pMethods).
5fa0: 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70  ./*.** If file p
5fb0: 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c  Fd is open, call
5fc0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
5fd0: 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61  () on it..*/.sta
5fe0: 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b  tic int osUnlock
5ff0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
6000: 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  Fd, int eLock){.
6010: 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 46    if( !isOpen(pF
6020: 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d) ){.    return
6030: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
6040: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6050: 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c  OsUnlock(pFd, eL
6060: 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ock);.}../*.** T
6070: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
6080: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
6090: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
60a0: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
60b0: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
60c0: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
60d0: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
60e0: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
60f0: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
6100: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
6110: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
6120: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
6130: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
6140: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
6150: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
6160: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
6170: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
6180: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
6190: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
61a0: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
61b0: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
61c0: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
61d0: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  ze..**.** The op
61e0: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c  timization is al
61f0: 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65  so always enable
6200: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
6210: 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20  files. It is.** 
6220: 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c  an error to call
6230: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
6240: 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e  f pPager is open
6250: 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed on an in-memo
6260: 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  ry.** database..
6270: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
6280: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
6290: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
62a0: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
62b0: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
62c0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
62d0: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
62e0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
62f0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
6300: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
6310: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
6320: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
6330: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
6340: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
6350: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
6360: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
6370: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
6380: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
6390: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
63a0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
63b0: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
63e0: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
63f0: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b      int nSector;
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
6420: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  size */.    int 
6430: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  szPage;         
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6450: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   Page size */.. 
6460: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
6470: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
6480: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
6490: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
64a0: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
64b0: 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  >fd);.    nSecto
64c0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74  r = pPager->sect
64d0: 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61  orSize;.    szPa
64e0: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
64f0: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
6500: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
6510: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
6520: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
6530: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
6540: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
6550: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
6560: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
6570: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
6580: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
6590: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
65a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
65b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
65c0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
65d0: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
65e0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
65f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
6600: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
6610: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
6620: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
6630: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
6640: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
6650: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
6660: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
6670: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
6680: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
6690: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
66a0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
66b0: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
66c0: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
66d0: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
66e0: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
66f0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
6700: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
6710: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
6720: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
6730: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
6740: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
6750: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
6760: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
6770: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
6780: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
6790: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
67a0: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
67b0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
67c0: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
67d0: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
67e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
67f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
6800: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
6810: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
6820: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
6830: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
6840: 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48  {.  pPage->pageH
6850: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
6860: 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  hash(pPage);.}..
6870: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
6880: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
6890: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
68a0: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
68b0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
68c0: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
68d0: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
68e0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
68f0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
6900: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
6910: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
6920: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
6930: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
6940: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
6950: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
6960: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
6970: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
6980: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
6990: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
69a0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
69b0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
69c0: 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48  ert( !pPg->pageH
69d0: 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ash || pPager->e
69e0: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20  rrCode.      || 
69f0: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
6a00: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
6a10: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
6a20: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
6a30: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
6a40: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
6a50: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
6a60: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
6a70: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43  (X)  0.#define C
6a80: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
6a90: 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  dif  /* SQLITE_C
6aa0: 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f  HECK_PAGES */../
6ab0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
6ac0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
6ad0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
6ae0: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
6af0: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73  be open..** This
6b00: 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
6b10: 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73  ts to read a mas
6b20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
6b30: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a   name from the .
6b40: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
6b50: 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65  le and, if succe
6b60: 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74  ssful, copies it
6b70: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70   into memory sup
6b80: 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65  plied .** by the
6b90: 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d   caller. See com
6ba0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74  ments above writ
6bb0: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
6bc0: 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a   for the format.
6bd0: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
6be0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
6bf0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74  l file name at t
6c00: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
6c10: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
6c20: 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69  zMaster must poi
6c30: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
6c40: 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74  f at least nMast
6c50: 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  er bytes allocat
6c60: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c  ed by.** the cal
6c70: 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ler. This should
6c80: 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   be sqlite3_vfs.
6c90: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f  mxPathname+1 (to
6ca0: 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73   ensure there is
6cb0: 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65  .** enough space
6cc0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61   to write the ma
6cd0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6ce0: 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65  e). If the maste
6cf0: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d  r journal.** nam
6d00: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
6d10: 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20   is longer than 
6d20: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69  nMaster bytes (i
6d30: 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75  ncluding a.** nu
6d40: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74  l-terminator), t
6d50: 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64  hen this is hand
6d60: 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73  led as if no mas
6d70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6d80: 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
6d90: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
6da0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74  .**.** If a mast
6db0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
6dc0: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
6dd0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
6de0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
6df0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  e, then it is co
6e00: 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75  pied into the bu
6e10: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
6e20: 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a  by zMaster. A.**
6e30: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
6e40: 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64  byte is appended
6e50: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66   to the buffer f
6e60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73  ollowing the mas
6e70: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ter.** journal f
6e80: 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ile name..**.** 
6e90: 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69  If it is determi
6ea0: 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74  ned that no mast
6eb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
6ec0: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
6ed0: 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69  .** zMaster[0] i
6ee0: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
6ef0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
6f00: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
6f10: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
6f20: 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
6f30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
6f40: 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72   an SQLite.** er
6f50: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6f60: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
6f70: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
6f80: 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69  urnal(sqlite3_fi
6f90: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
6fa0: 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d  *zMaster, u32 nM
6fb0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
6fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6fd0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
6fe0: 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  ode */.  u32 len
6ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7000: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e      /* Length in
7010: 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72   bytes of master
7020: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
7030: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7050: 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62   Total size in b
7060: 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ytes of journal 
7070: 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20  file pJrnl */.  
7080: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a             /* MJ
70a0: 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
70b0: 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  read from journa
70c0: 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
70f0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
7100: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
7110: 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20  agic[8];   /* A 
7120: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
7130: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
7140: 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20  */.  zMaster[0] 
7150: 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53  = '\0';..  if( S
7160: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
7170: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
7180: 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a  e(pJrnl, &szJ)).
7190: 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20     || szJ<16.   
71a0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
71b0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
71c0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c  Jrnl, szJ-16, &l
71d0: 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d  en)).   || len>=
71e0: 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53  nMaster .   || S
71f0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
7200: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
7210: 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d  , szJ-12, &cksum
7220: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
7230: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
7240: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61  3OsRead(pJrnl, a
7250: 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29  Magic, 8, szJ-8)
7260: 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  ).   || memcmp(a
7270: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
7280: 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53  agic, 8).   || S
7290: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
72a0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
72b0: 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  rnl, zMaster, le
72c0: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a  n, szJ-16-len)).
72d0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
72e0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
72f0: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
7300: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
7310: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7320: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
7330: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
7340: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
7350: 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  r[u];.  }.  if( 
7360: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
7370: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
7380: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
7390: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
73a0: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
73b0: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
73c0: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
73d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
73e0: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
73f0: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
7400: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
7410: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
7420: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7430: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
7440: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
7450: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
7460: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
7470: 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a  len = 0;.  }.  z
7480: 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c  Master[len] = '\
7490: 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e  0';.   .  return
74a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
74b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
74c0: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65  offset of the se
74d0: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74  ctor boundary at
74e0: 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   or immediately 
74f0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
7500: 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65  e value in pPage
7510: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61  r->journalOff, a
7520: 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72  ssuming a sector
7530: 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61   .** size of pPa
7540: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
7550: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  bytes..**.** i.e
7560: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
7570: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
7580: 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c     Pager.journal
7590: 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74  Off          Ret
75a0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d  urn value.**   -
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75d0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20  ------.**   0   
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32        0.**   512
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7610: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
7620: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
7630: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
7640: 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20     2000         
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
7660: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
7670: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  i64 journalHdrOf
7680: 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  fset(Pager *pPag
7690: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
76a0: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
76b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
76c0: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
76d0: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
76e0: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
76f0: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
7700: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
7710: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7720: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
7730: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
7740: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
7750: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
7760: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
7770: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
7780: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
7790: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65  ;.  return offse
77a0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
77b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
77c0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
77d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
77e0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
77f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
7800: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f   no-op if the jo
7810: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e  urnal file has n
7820: 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ot been written 
7830: 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  to.** within the
7840: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
7850: 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61  tion (i.e. if Pa
7860: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  ger.journalOff==
7870: 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54  0)..**.** If doT
7880: 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a  runcate is non-z
7890: 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72  ero or the Pager
78a0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
78b0: 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a  t variable is.**
78c0: 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20   set to 0, then 
78d0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
78e0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72  rnal file to zer
78f0: 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
7900: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a   Otherwise,.** z
7910: 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20  ero the 28-byte 
7920: 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74  header at the st
7930: 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
7940: 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68  al file. In eith
7950: 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20  er case, .** if 
7960: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
7970: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
7980: 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
7990: 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  al file immediat
79a0: 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72  ely .** after wr
79b0: 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  iting or truncat
79c0: 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ing it..**.** If
79d0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
79e0: 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74  zeLimit is set t
79f0: 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f  o a positive, no
7a00: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e  n-zero value, an
7a10: 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  d.** following t
7a20: 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72  he truncation or
7a30: 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62   zeroing describ
7a40: 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a  ed above the siz
7a50: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75  e of the .** jou
7a60: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
7a70: 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  es is larger tha
7a80: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68  n this value, th
7a90: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  en truncate the.
7aa0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
7ab0: 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  to Pager.journal
7ac0: 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e  SizeLimit bytes.
7ad0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
7ae0: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65  e does.** not ne
7af0: 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20  ed to be synced 
7b00: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f  following this o
7b10: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
7b20: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
7b30: 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70  ccurs, abandon p
7b40: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
7b50: 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  turn the IO erro
7b60: 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72  r code..** Other
7b70: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  wise, return SQL
7b80: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
7b90: 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61  c int zeroJourna
7ba0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
7bb0: 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61  er, int doTrunca
7bc0: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  te){.  int rc = 
7bd0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
7c00: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73  rn code */.  ass
7c10: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
7c20: 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66  er->jfd) );.  if
7c30: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
7c40: 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73  lOff ){.    cons
7c50: 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70  t i64 iLimit = p
7c60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
7c70: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c  zeLimit;    /* L
7c80: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73  ocal cache of js
7c90: 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43  l */..    IOTRAC
7ca0: 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c  E(("JZEROHDR %p\
7cb0: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
7cc0: 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20   if( doTruncate 
7cd0: 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a  || iLimit==0 ){.
7ce0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7cf0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
7d00: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
7d10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
7d20: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7d30: 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b   zeroHdr[28] = {
7d40: 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  0};.      rc = s
7d50: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
7d60: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48  ager->jfd, zeroH
7d70: 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48  dr, sizeof(zeroH
7d80: 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  dr), 0);.    }. 
7d90: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7da0: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
7db0: 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
7dc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
7dd0: 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
7de0: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54   SQLITE_SYNC_DAT
7df0: 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79  AONLY|pPager->sy
7e00: 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
7e10: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
7e20: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
7e30: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
7e40: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
7e50: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
7e60: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
7e70: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
7e80: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
7e90: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
7ea0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
7eb0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
7ec0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
7ed0: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
7ee0: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
7ef0: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
7f00: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
7f10: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
7f20: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
7f30: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
7f40: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
7f50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
7f60: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
7f70: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
7f80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
7f90: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
7fa0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
7fb0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
7fc0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
7fd0: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
7fe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7ff0: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
8000: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8010: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
8020: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
8030: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8040: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
8060: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
8070: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
8080: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8090: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
80a0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
80b0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
80c0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
80d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
80e0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
80f0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
8100: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
8110: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
8120: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
8130: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
8140: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
8150: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
8160: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
8170: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
8180: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
8190: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
81a0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
81b0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
81c0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
81d0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
81e0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
81f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
8200: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
8210: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
8220: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
8230: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
8240: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
8250: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
8260: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
8270: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
8280: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8290: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
82a0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
82b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
82c0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
82d0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
82e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
82f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8300: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
8310: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
8320: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
8330: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
8340: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
8350: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
8360: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
8370: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  er = pPager->pag
8380: 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 53 69  eSize;     /* Si
8390: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
83a0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
83b0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
83c0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
83e0: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
83f0: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
8400: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8430: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
8440: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
8450: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
8460: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
8470: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
8480: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
8490: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
84a0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
84b0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
84c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
84d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
84e0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
84f0: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
8500: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
8510: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
8520: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
8530: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
8540: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
8550: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
8560: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
8570: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
8580: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
8590: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
85a0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
85b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
85c0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
85d0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
85e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
85f0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
8600: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
8610: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8620: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
8630: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
8640: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
8650: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
8660: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
8670: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
8680: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
8690: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
86a0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
86b0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
86c0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
86d0: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
86e0: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
86f0: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
8700: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
8710: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
8720: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
8730: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
8740: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
8750: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
8760: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
8770: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
8780: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
8790: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
87a0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
87b0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
87c0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
87d0: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
87e0: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
87f0: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
8800: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
8810: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
8820: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
8830: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
8840: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
8850: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
8860: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
8870: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
8880: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
8890: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
88a0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
88b0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
88c0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
88d0: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
88e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
88f0: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
8900: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
8910: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
8920: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
8930: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
8940: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
8950: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
8960: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
8970: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
8980: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
8990: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
89a0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
89b0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
89c0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
89d0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
89e0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
89f0: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
8a00: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
8a10: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
8a20: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
8a30: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
8a40: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
8a50: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
8a60: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
8a70: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
8a80: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
8a90: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
8aa0: 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70 50 61 67  noSync) || (pPag
8ab0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
8ac0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
8ad0: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
8ae0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
8af0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
8b00: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
8b10: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
8b20: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
8b30: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
8b40: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
8b50: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8b60: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
8b70: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
8b80: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8b90: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
8ba0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
8bb0: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
8bc0: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
8bd0: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
8be0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
8bf0: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
8c00: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
8c10: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
8c20: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
8c30: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
8c40: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8c50: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
8c60: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
8c70: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
8c80: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
8c90: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
8ca0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
8cb0: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
8cc0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
8cd0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8ce0: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
8cf0: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
8d00: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
8d10: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
8d20: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
8d30: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8d40: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8d50: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
8d60: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
8d70: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
8d80: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
8d90: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
8da0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
8db0: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
8dc0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
8dd0: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
8de0: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
8df0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
8e00: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
8e10: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
8e20: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
8e30: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
8e40: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
8e50: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
8e60: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
8e70: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
8e80: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
8e90: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
8ea0: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
8eb0: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
8ec0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
8ed0: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
8ee0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8ef0: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
8f00: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
8f10: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8f20: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
8f30: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
8f40: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
8f50: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
8f60: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
8f70: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
8f80: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
8f90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
8fa0: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
8fb0: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
8fc0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
8fd0: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
8fe0: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
8ff0: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
9000: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
9010: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
9020: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
9030: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
9040: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
9050: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
9060: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
9070: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
9080: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
9090: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
90a0: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
90b0: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
90c0: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
90d0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
90e0: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
90f0: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
9100: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
9110: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
9120: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
9130: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
9140: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
9150: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
9160: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
9170: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
9180: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
9190: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
91a0: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
91b0: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
91c0: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
91d0: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
91e0: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
91f0: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
9200: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
9210: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
9220: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
9230: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
9240: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
9250: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
9260: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
9270: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
9280: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
9290: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
92a0: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
92b0: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
92c0: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
92d0: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
92e0: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
92f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9300: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
9310: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
9320: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
9330: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
9340: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
9350: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
9360: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9370: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
9380: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
9390: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
93a0: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
93b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
93c0: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
93d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
93e0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
93f0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
9400: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
9410: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9420: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
9430: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
9440: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
9450: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
9460: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
9470: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
9480: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
9490: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
94a0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
94b0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
94c0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
94d0: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
94e0: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
94f0: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
9500: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
9510: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
9520: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
9530: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
9540: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
9550: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9560: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
9570: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
9580: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
9590: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
95a0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
95b0: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
95c0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
95d0: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
95e0: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
95f0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
9600: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
9610: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
9620: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
9630: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
9640: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
9650: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
9660: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
9670: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
9680: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
9690: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
96a0: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
96b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
96c0: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
96d0: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
96e0: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
96f0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
9700: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
9710: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
9720: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
9730: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
9740: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
9750: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
9760: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
9770: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
9780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
9790: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
97a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
97c0: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
97d0: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
97e0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9800: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
9810: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
9820: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
9830: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
9840: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
9850: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
9860: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
9870: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
98a0: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
98b0: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
98c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98e0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
98f0: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
9900: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
9910: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
9920: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
9930: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
9940: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
9950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9960: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
9970: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
9980: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
9990: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
99a0: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
99b0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
99c0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
99d0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
99e0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
99f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
9a00: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
9a10: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
9a20: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
9a30: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
9a40: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
9a50: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
9a60: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
9a70: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
9a80: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
9a90: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
9aa0: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
9ab0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9ac0: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
9ad0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9ae0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
9af0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9b00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
9b10: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
9b20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
9b30: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
9b40: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
9b50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
9b60: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
9b70: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
9b80: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
9b90: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
9ba0: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
9bb0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
9bc0: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
9bd0: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
9be0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
9bf0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
9c00: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
9c10: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
9c20: 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
9c30: 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
9c40: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
9c50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9c60: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
9c70: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
9c80: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
9c90: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
9ca0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9cb0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
9cc0: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
9cd0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
9ce0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
9cf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
9d00: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
9d10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9d20: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
9d30: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
9d40: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
9d50: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
9d60: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
9d70: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
9d80: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
9d90: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
9da0: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
9db0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
9dc0: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
9dd0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
9de0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
9df0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
9e00: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
9e10: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
9e20: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
9e30: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
9e40: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
9e50: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
9e60: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
9e70: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
9e80: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
9e90: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
9ea0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
9eb0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
9ec0: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
9ed0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
9ee0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
9ef0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
9f00: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
9f10: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
9f20: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
9f30: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
9f40: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
9f50: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
9f60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
9f70: 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
9f80: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
9f90: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  eader */.    u16
9fa0: 20 69 50 61 67 65 53 69 7a 65 31 36 3b 20 20 20   iPageSize16;   
9fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
9fc0: 79 20 6f 66 20 69 50 61 67 65 53 69 7a 65 20 69  y of iPageSize i
9fd0: 6e 20 31 36 2d 62 69 74 20 76 61 72 69 61 62 6c  n 16-bit variabl
9fe0: 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  e */..    /* Rea
9ff0: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
a000: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
a010: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
a020: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
a030: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
a040: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
a050: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
a060: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
a070: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
a080: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
a090: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
a0a0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
a0b0: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
a0c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
a0d0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
a0e0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
a0f0: 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64   the values read
a100: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73   from the page-s
a110: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
a120: 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a  ize fields.    *
a130: 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  * are within ran
a140: 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61  ge. To be 'in ra
a150: 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65  nge', both value
a160: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70  s need to be a p
a170: 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ower.    ** of t
a180: 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
a190: 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20  or equal to 512 
a1a0: 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67  or 32, and not g
a1b0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
a1c0: 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63  r .    ** respec
a1d0: 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d  tive compile tim
a1e0: 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73  e maximum limits
a1f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a200: 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20   iPageSize<512  
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a220: 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33  || iSectorSize<3
a230: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
a240: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
a250: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
a260: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
a270: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
a280: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
a290: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
a2a0: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
a2b0: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
a2c0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
a2d0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
a2e0: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
a2f0: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
a300: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
a310: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
a320: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
a330: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
a340: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
a350: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
a360: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
a370: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
a380: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
a390: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
a3a0: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
a3b0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
a3c0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
a3d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
a3e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
a3f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a400: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
a410: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
a420: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
a430: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
a440: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
a450: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
a460: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
a470: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
a480: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
a490: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
a4a0: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
a4b0: 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65  */.    iPageSize
a4c0: 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53  16 = (u16)iPageS
a4d0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
a4e0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
a4f0: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
a500: 50 61 67 65 53 69 7a 65 31 36 2c 20 2d 31 29 3b  PageSize16, -1);
a510: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
a520: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
a530: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
a540: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61  SQLITE_OK || iPa
a550: 67 65 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69  geSize16==(u16)i
a560: 50 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  PageSize );..   
a570: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
a580: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
a590: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
a5a0: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
a5b0: 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
a5c0: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
a5d0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
a5e0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
a5f0: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
a600: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
a610: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
a620: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
a630: 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
a640: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
a650: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
a660: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
a670: 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
a680: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
a690: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
a6a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
a6b0: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
a6c0: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
a6d0: 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
a6e0: 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
a6f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a700: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
a710: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
a720: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
a730: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
a740: 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
a750: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
a760: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a770: 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
a780: 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
a790: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
a7a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a7b0: 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
a7c0: 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
a7d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
a7e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
a7f0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
a800: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
a810: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
a820: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
a830: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
a840: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
a850: 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
a860: 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
a870: 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
a880: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
a890: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
a8a0: 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
a8b0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
a8c0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
a8d0: 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
a8e0: 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
a8f0: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
a900: 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
a910: 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
a920: 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
a930: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
a940: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
a950: 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
a960: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
a970: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
a980: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
a990: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
a9a0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
a9b0: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
a9c0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
a9d0: 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
a9e0: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
a9f0: 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
aa00: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
aa10: 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
aa20: 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
aa30: 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
aa40: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
aa50: 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
aa60: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
aa70: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
aa80: 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
aa90: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
aaa0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
aab0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
aac0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
aaf0: 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
ab20: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
ab30: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
ab40: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
ab50: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
ab60: 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
ab70: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
ab80: 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aba0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
abb0: 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
abc0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
abd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
abe0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
abf0: 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
ac00: 73 74 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ster */..  if( !
ac10: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
ac20: 72 2d 3e 73 65 74 4d 61 73 74 65 72 0a 20 20 20  r->setMaster.   
ac30: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
ac40: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ac50: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
ac60: 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
ac70: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ac80: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
ac90: 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  FF .  ){.    ret
aca0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
acb0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
acc0: 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
acd0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
ace0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
acf0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
ad00: 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
ad10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ad20: 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
ad30: 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
ad40: 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
ad50: 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
ad60: 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
ad70: 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
ad80: 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
ad90: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
ada0: 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
adb0: 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
adc0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
add0: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
ade0: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
adf0: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
ae00: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
ae10: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
ae20: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
ae30: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
ae40: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
ae50: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
ae60: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
ae70: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
ae80: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
ae90: 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
aea0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
aeb0: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
aec0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
aed0: 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
aee0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
aef0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
af00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
af10: 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
af20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
af30: 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
af40: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
af50: 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
af60: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
af70: 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
af80: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
af90: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
afa0: 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
afb0: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
afc0: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
afd0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
afe0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
aff0: 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
b000: 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
b010: 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
b020: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
b030: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
b040: 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
b050: 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
b060: 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
b070: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
b080: 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
b090: 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
b0a0: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
b0b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
b0c0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
b0d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
b0e0: 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
b0f0: 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
b100: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
b110: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
b120: 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
b130: 2b 32 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  +20);.  pPager->
b140: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
b150: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f  er->noSync;..  /
b160: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
b170: 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
b180: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
b190: 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
b1a0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
b1b0: 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
b1c0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
b1d0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
b1e0: 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
b1f0: 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
b200: 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
b210: 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
b220: 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
b230: 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
b240: 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
b250: 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
b260: 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
b270: 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
b280: 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
b290: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
b2a0: 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
b2b0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b2c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
b2d0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
b2e0: 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
b2f0: 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
b300: 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
b310: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
b320: 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
b330: 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
b340: 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
b350: 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
b360: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
b370: 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
b380: 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
b390: 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
b3a0: 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
b3b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
b3c0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
b3d0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
b3e0: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
b3f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b400: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
b410: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
b420: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
b430: 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a   number. Return.
b440: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
b450: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
b460: 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65   if the requeste
b470: 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a  d page is not .*
b480: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d  * already in mem
b490: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ory..*/.static P
b4a0: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
b4b0: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
b4c0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
b4d0: 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
b500: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
b510: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
b520: 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63  r a call to Pcac
b530: 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63  heFetch() with c
b540: 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a  reateFlag==0 to.
b550: 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65    ** fail, since
b560: 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   no attempt to a
b570: 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20  llocate dynamic 
b580: 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d  memory will be m
b590: 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  ade..  */.  (voi
b5a0: 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  d)sqlite3PcacheF
b5b0: 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
b5c0: 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
b5d0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  p);.  return p;.
b5e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  }../*.** Unless 
b5f0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
b600: 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 64 69 73  error-state, dis
b610: 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
b620: 72 79 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a 20  ry pages. If.** 
b630: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
b640: 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 65  error-state, the
b650: 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  n this call is a
b660: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f   no-op..**.** TO
b670: 44 4f 3a 20 57 68 79 20 63 61 6e 20 77 65 20 6e  DO: Why can we n
b680: 6f 74 20 72 65 73 65 74 20 74 68 65 20 70 61 67  ot reset the pag
b690: 65 72 20 77 68 69 6c 65 20 69 6e 20 65 72 72 6f  er while in erro
b6a0: 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61 74  r state?.*/.stat
b6b0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
b6c0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
b6d0: 72 29 7b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  r){.  if( SQLITE
b6e0: 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72 72  _OK==pPager->err
b6f0: 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Code ){.    sqli
b700: 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
b710: 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
b720: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
b730: 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
b740: 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
b750: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
b760: 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  lid = 0;.  }.}..
b770: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73  /*.** Free all s
b780: 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
b790: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
b7a0: 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65  t[] array and se
b7b0: 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e  t both.** Pager.
b7c0: 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50  aSavepoint and P
b7d0: 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20  ager.nSavepoint 
b7e0: 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74  to zero. Close t
b7f0: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
b800: 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20  * if it is open 
b810: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
b820: 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
b830: 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  e mode..*/.stati
b840: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c  c void releaseAl
b850: 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65  lSavepoints(Page
b860: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
b870: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
b880: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
b890: 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  for looping thro
b8a0: 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70  ugh Pager.aSavep
b8b0: 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69  oint */.  for(ii
b8c0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
b8d0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
b8e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
b8f0: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
b900: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
b910: 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
b920: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
b930: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
b940: 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65  e || sqlite3IsMe
b950: 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
b960: 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71  >sjfd) ){.    sq
b970: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
b980: 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a  ger->sjfd);.  }.
b990: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b9a0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
b9b0: 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53  t);.  pPager->aS
b9c0: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
b9d0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
b9e0: 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
b9f0: 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d  ->nSubRec = 0;.}
ba00: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
ba10: 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  bit number pgno 
ba20: 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65  in the PagerSave
ba30: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
ba40: 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f  nt .** bitvecs o
ba50: 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  f all open savep
ba60: 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51  oints. Return SQ
ba70: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
ba80: 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49  ssful.** or SQLI
ba90: 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
baa0: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
bab0: 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
bac0: 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  nt addToSavepoin
bad0: 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a  tBitvecs(Pager *
bae0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
baf0: 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  o){.  int ii;   
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb10: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
bb20: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
bb30: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
bb40: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
bb50: 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
bb60: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
bb70: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
bb80: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
bb90: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
bba0: 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  vepoint[ii];.   
bbb0: 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f   if( pgno<=p->nO
bbc0: 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
bbd0: 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  |= sqlite3Bitvec
bbe0: 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  Set(p->pInSavepo
bbf0: 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  int, pgno);.    
bc00: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
bc10: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
bc20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
bc30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
bc40: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
bc50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
bc60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bc70: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
bc80: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
bc90: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
bca0: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
bcb0: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
bcc0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
bcd0: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
bce0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
bcf0: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
bd00: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
bd10: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
bd20: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
bd30: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
bd40: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
bd50: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
bd60: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
bd70: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
bd80: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
bd90: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29  rames(v,w,x,y,z)
bda0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
bdb0: 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
bdc0: 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  t(z) SQLITE_OK.#
bdd0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  endif../*.** Unl
bde0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
bdf0: 20 66 69 6c 65 2e 20 54 68 69 73 20 66 75 6e 63   file. This func
be00: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
be10: 69 66 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  if the pager.** 
be20: 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
be30: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mode..**.** If t
be40: 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
be50: 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73  ently in error s
be60: 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68  tate, discard th
be70: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a  e contents of .*
be80: 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  * the cache and 
be90: 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20  reset the Pager 
bea0: 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e  structure intern
beb0: 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  al state. If the
bec0: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e  re is.** an open
bed0: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74   journal-file, t
bee0: 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hen the next tim
bef0: 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  e a shared-lock 
bf00: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f  is obtained.** o
bf10: 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
bf20: 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79   (by this or any
bf30: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c   other process),
bf40: 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74   it will be.** t
bf50: 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d  reated as a hot-
bf60: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
bf70: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
bf80: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
bf90: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
bfa0: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
bfb0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
bfc0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  e ){.    int rc 
bfd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
bfe0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
bff0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  code */..    /* 
c000: 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65  Always close the
c010: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c020: 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
c030: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20  database lock.. 
c040: 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
c050: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
c060: 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
c070: 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
c080: 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65  ht.    ** delete
c090: 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72   the file out fr
c0a0: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
c0b0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
c0c0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
c0d0: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
c0e0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
c0f0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
c100: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
c110: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
c120: 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76     releaseAllSav
c130: 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
c140: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
c150: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
c160: 2c 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20  , somebody else 
c170: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e  might change it.
c180: 20 54 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75   The.    ** valu
c190: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  es stored in Pag
c1a0: 65 72 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d  er.dbSize etc. m
c1b0: 69 67 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61  ight become inva
c1c0: 6c 69 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  lid if.    ** th
c1d0: 69 73 20 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65  is happens.  One
c1e0: 20 63 61 6e 20 61 72 67 75 65 20 74 68 61 74 20   can argue that 
c1f0: 74 68 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65  this doesn't nee
c200: 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a  d to be cleared.
c210: 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65      ** until the
c220: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
c230: 63 68 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50  check fails in P
c240: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
c250: 2e 0a 20 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e  ..    ** Clearin
c260: 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  g the page size 
c270: 63 61 63 68 65 20 68 65 72 65 20 69 73 20 62 65  cache here is be
c280: 69 6e 67 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ing conservative
c290: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
c2a0: 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
c2b0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
c2c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
c2d0: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
c2e0: 74 65 33 57 61 6c 43 6c 6f 73 65 53 6e 61 70 73  te3WalCloseSnaps
c2f0: 68 6f 74 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  hot(pPager->pWal
c300: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c310: 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63      rc = osUnloc
c320: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
c330: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  _LOCK);.    }.  
c340: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c350: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
c360: 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  e = rc;.    }.  
c370: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
c380: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
c390: 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61  ))..    /* If Pa
c3a0: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
c3b0: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
c3c0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
c3d0: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
c3e0: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
c3f0: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
c400: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
c410: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
c420: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
c430: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
c440: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
c450: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
c460: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
c470: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
c480: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
c490: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c4a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
c4b0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
c4c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
c4d0: 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  }.      pager_re
c4e0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
c4f0: 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
c500: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
c510: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
c520: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
c530: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65  NLOCK;.    pPage
c540: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
c550: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
c560: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
c570: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
c580: 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f  hen an IOERR, CO
c590: 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72  RRUPT or FULL er
c5a0: 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20  ror.** may have 
c5b0: 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69  occurred. The fi
c5c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
c5d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c5e0: 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63   pager .** struc
c5f0: 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
c600: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
c610: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
c620: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
c630: 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  .** API function
c640: 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
c650: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
c660: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
c670: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69  ument .** to thi
c680: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
c690: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
c6a0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
c6b0: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
c6c0: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
c6d0: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
c6e0: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
c6f0: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
c700: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65   the persisten e
c710: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
c720: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
c730: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
c740: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
c750: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
c760: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
c770: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
c780: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
c790: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
c7a0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
c7b0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
c7c0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
c7d0: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
c7e0: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
c7f0: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
c800: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
c810: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
c820: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
c830: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
c840: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
c850: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
c860: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  t error occurred
c870: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
c880: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  ack journal may 
c890: 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65  need.** to be re
c8a0: 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72  played to restor
c8b0: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
c8c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
c8d0: 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74  ile (as if.** it
c8e0: 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72   were a hot-jour
c8f0: 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nal)..*/.static 
c900: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
c910: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
c920: 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
c930: 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
c940: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
c950: 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
c960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20   );.  assert(.  
c970: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
c980: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
c990: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
c9a0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
c9b0: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
c9c0: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
c9d0: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
c9e0: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
c9f0: 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46  f( rc2==SQLITE_F
ca00: 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49  ULL || rc2==SQLI
ca10: 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
ca20: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
ca30: 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = rc;.  }.  retu
ca40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ca50: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
ca60: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
ca70: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
ca80: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
ca90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
caa0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
cab0: 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
cac0: 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
cad0: 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  r state, do not 
cae0: 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
caf0: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
cb00: 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
cb10: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
cb20: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
cb30: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
cb40: 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
cb50: 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
cb60: 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
cb70: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
cb80: 20 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20   file and clear 
cb90: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
cba0: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
cbb0: 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  hat.** there is 
cbc0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
cbd0: 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
cbe0: 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
cbf0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f  connection.** to
cc00: 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
cc10: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
cc20: 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
cc30: 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a   this one) will.
cc40: 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ** roll it back.
cc50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
cc60: 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
cc70: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
cc80: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74  error state, but
cc90: 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
cca0: 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
ccb0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
ccc0: 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
ccd0: 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
cce0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
ccf0: 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
cd00: 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
cd10: 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
cd20: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
cd30: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
cd40: 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
cd50: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
cd60: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
cd70: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
cd80: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
cd90: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
cda0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
cdb0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
cdc0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
cdd0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
cde0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
cdf0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
ce00: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
ce10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
ce20: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
ce30: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
ce40: 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
ce50: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ce60: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
ce70: 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
ce80: 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
ce90: 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
cea0: 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
ceb0: 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
cec0: 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
ced0: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
cee0: 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
cef0: 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
cf00: 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
cf10: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
cf20: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
cf30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
cf40: 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
cf50: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
cf60: 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
cf70: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
cf80: 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  n..** .** If the
cf90: 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
cfa0: 45 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47  ER_SHARED or PAG
cfb0: 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
cfc0: 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  when this.** rou
cfd0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
cfe0: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72  it is a no-op (r
cff0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
d000: 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
d010: 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73  se, any active s
d020: 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65  avepoints are re
d030: 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leased..**.** If
d040: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d050: 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
d060: 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64  it is "finalized
d070: 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61  ". Once a journa
d080: 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62  l .** file has b
d090: 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74  een finalized it
d0a0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
d0b0: 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f   to use it to ro
d0c0: 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72  ll back a .** tr
d0d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77  ansaction. Nor w
d0e0: 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64  ill it be consid
d0f0: 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74  ered to be a hot
d100: 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73  -journal by this
d110: 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  .** or any other
d120: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d130: 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f  tion. Exactly ho
d140: 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  w a journal is f
d150: 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65  inalized.** depe
d160: 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
d170: 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20  r not the pager 
d180: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
d190: 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
d1a0: 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
d1b0: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61  journal-mode (Pa
d1c0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
d1d0: 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f  value), as follo
d1e0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ws:.**.**   jour
d1f0: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a  nalMode==MEMORY.
d200: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
d210: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
d220: 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e  s simply closed.
d230: 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61   This destroys a
d240: 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d  n .**     in-mem
d250: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ory journal..**.
d260: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
d270: 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  ==TRUNCATE.**   
d280: 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    Journal file i
d290: 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  s truncated to z
d2a0: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
d2b0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  e..**.**   journ
d2c0: 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a  alMode==PERSIST.
d2d0: 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74  **     The first
d2e0: 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65   28 bytes of the
d2f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
d300: 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69  e zeroed. This i
d310: 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20  nvalidates.**   
d320: 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72    the first jour
d330: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
d340: 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63  e file, and henc
d350: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
d360: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
d370: 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75  . An invalid jou
d380: 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74  rnal file cannot
d390: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
d3a0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
d3b0: 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20  Mode==DELETE.** 
d3c0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
d3d0: 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61  file is closed a
d3e0: 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  nd deleted using
d3f0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
d400: 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66  ()..**.**     If
d410: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
d420: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
d430: 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65  ve mode, this me
d440: 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69  thod of finalizi
d450: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  ng.**     the jo
d460: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
d470: 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61  ver used. Instea
d480: 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  d, if the journa
d490: 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20  lMode is.**     
d4a0: 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70  DELETE and the p
d4b0: 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
d4c0: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d  sive mode, the m
d4d0: 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
d4e0: 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75  under.**     jou
d4f0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
d500: 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  T is used instea
d510: 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  d..**.** After t
d520: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69  he journal is fi
d530: 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e  nalized, if runn
d540: 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
d550: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sive mode, the.*
d560: 2a 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  * pager moves to
d570: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
d580: 61 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61  ate (and downgra
d590: 64 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  des the lock on 
d5a0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
d5b0: 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  file accordingly
d5c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
d5d0: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
d5e0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
d5f0: 64 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47  de and is in PAG
d600: 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c  ER_SYNCED state,
d610: 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20  .** it moves to 
d620: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e  PAGER_EXCLUSIVE.
d630: 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f   No locks are do
d640: 77 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75  wngraded when ru
d650: 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c  nning in.** excl
d660: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
d670: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
d680: 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
d690: 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
d6a0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
d6b0: 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
d6c0: 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
d6d0: 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
d6e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
d6f0: 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
d700: 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
d710: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
d720: 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
d730: 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
d740: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
d750: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
d760: 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
d770: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
d780: 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
d790: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
d7a0: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
d7b0: 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
d7c0: 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
d7d0: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
d7e0: 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
d7f0: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
d800: 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
d810: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
d820: 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
d830: 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
d840: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
d850: 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
d860: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d870: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
d880: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
d890: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
d8a0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
d8b0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d8c0: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
d8d0: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
d8e0: 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
d8f0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
d900: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d910: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
d920: 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
d930: 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
d940: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
d950: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
d960: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
d970: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d980: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
d990: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
d9a0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
d9b0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
d9c0: 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
d9d0: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
d9e0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
d9f0: 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
da00: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
da10: 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
da20: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
da30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
da40: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
da50: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
da60: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
da70: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
da80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
da90: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
daa0: 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
dab0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
dac0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
dad0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
dae0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
daf0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
db00: 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
db10: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
db20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
db30: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
db40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
db50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
db60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
db70: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
db80: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  jfd, 0);.      }
db90: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
dba0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
dbb0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
dbc0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
dbd0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
dbe0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
dbf0: 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50  Mode .     || pP
dc00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
dc10: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
dc20: 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
dc30: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
dc40: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
dc50: 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
dc60: 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
dc70: 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
dc80: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
dc90: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
dca0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
dcb0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
dcc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dcd0: 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
dce0: 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
dcf0: 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
dd00: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
dd10: 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
dd20: 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
dd30: 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
dd40: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
dd50: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
dd60: 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
dd70: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
dd80: 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
dd90: 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
dda0: 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
ddb0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
ddc0: 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
ddd0: 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
dde0: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a  ournal. .      *
ddf0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
de00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
de10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
de20: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
de30: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
de40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
de50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
de60: 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
de70: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
de80: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
de90: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
dea0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
deb0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
dec0: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
ded0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
dee0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
def0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
df00: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
df10: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
df20: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
df30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
df40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
df50: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73  HECK_PAGES.    s
df60: 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
df70: 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
df80: 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
df90: 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23  set_pagehash);.#
dfa0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
dfb0: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
dfc0: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
dfd0: 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
dfe0: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
dff0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
e000: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   0;.  sqlite3Pca
e010: 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
e020: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
e030: 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
e040: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
e050: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
e060: 57 72 69 74 65 4c 6f 63 6b 28 70 50 61 67 65 72  WriteLock(pPager
e070: 2d 3e 70 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ->pWal, 0);.    
e080: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e090: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
e0a0: 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
e0b0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
e0c0: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73   ){.    rc2 = os
e0d0: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
e0e0: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
e0f0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
e100: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
e110: 44 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  D;.    pPager->c
e120: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
e130: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
e140: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
e150: 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20  AGER_SYNCED ){. 
e160: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
e170: 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
e180: 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  VE;.  }.  pPager
e190: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
e1a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
e1b0: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
e1c0: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
e1d0: 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  0;..  /* TODO: I
e1e0: 73 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20  s this optimal? 
e1f0: 57 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69  Why is the db si
e200: 7a 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68  ze invalidated h
e210: 65 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74  ere .  ** when t
e220: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e230: 20 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64   is not unlocked
e240: 3f 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ? */.  pPager->d
e250: 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20  bOrigSize = 0;. 
e260: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
e270: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
e280: 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
e290: 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21  dbSize);.  if( !
e2a0: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
e2b0: 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
e2c0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
e2d0: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
e2e0: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
e2f0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
e300: 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
e310: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
e320: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
e330: 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
e340: 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
e350: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
e360: 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
e370: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
e380: 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
e390: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
e3a0: 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
e3b0: 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
e3c0: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
e3d0: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
e3e0: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
e3f0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
e400: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
e410: 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
e420: 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
e430: 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
e440: 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
e450: 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
e460: 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
e470: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
e480: 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
e490: 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
e4a0: 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
e4b0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
e4c0: 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
e4d0: 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
e4e0: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
e4f0: 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
e500: 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
e510: 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
e520: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
e530: 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
e540: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
e550: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
e560: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
e570: 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
e580: 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
e590: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
e5a0: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
e5b0: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
e5c0: 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
e5d0: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
e5e0: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
e5f0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
e600: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
e610: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
e620: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
e630: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
e640: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
e650: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
e660: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
e670: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
e680: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
e690: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
e6a0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
e6b0: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
e6c0: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
e6d0: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
e6e0: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
e6f0: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
e700: 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
e710: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
e720: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
e730: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
e740: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e750: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
e760: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
e770: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
e780: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
e790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
e7a0: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  m;.}../*.** Read
e7b0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
e7c0: 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
e7d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
e7e0: 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
e7f0: 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
e800: 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
e810: 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
e820: 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
e830: 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
e840: 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
e850: 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
e860: 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
e870: 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
e880: 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
e890: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
e8a0: 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
e8b0: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
e8c0: 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   The isMainJrnl 
e8d0: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
e8e0: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  this is the main
e8f0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
e900: 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66  l and.** false f
e910: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
e920: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
e930: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
e940: 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65  rnal uses.** che
e950: 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
e960: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
e970: 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  oes not..**.** I
e980: 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
e990: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
e9a0: 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
e9b0: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
e9c0: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
e9d0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
e9e0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
e9f0: 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
ea00: 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
ea10: 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
ea20: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
ea30: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
ea40: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
ea50: 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
ea60: 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
ea70: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
ea80: 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
ea90: 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
eaa0: 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
eab0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
eac0: 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
ead0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
eae0: 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
eaf0: 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
eb00: 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
eb10: 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
eb20: 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
eb30: 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
eb40: 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
eb50: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
eb60: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
eb70: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
eb80: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
eb90: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
eba0: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
ebb0: 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
ebc0: 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
ebd0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
ebe0: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
ebf0: 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
ec00: 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
ec10: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
ec20: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
ec30: 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
ec40: 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
ec50: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
ec60: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
ec70: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
ec80: 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
ec90: 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
eca0: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
ecb0: 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
ecc0: 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
ecd0: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
ece0: 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
ecf0: 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
ed00: 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
ed10: 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
ed20: 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
ed30: 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
ed40: 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
ed50: 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
ed60: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
ed70: 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
ed80: 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
ed90: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
eda0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
edb0: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
edc0: 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
edd0: 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
ede0: 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
edf0: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
ee00: 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
ee10: 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
ee20: 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
ee30: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
ee40: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
ee50: 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
ee60: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
ee70: 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
ee80: 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
ee90: 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
eea0: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
eeb0: 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
eec0: 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
eed0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
eee0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
eef0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
ef00: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
ef10: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
ef20: 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
ef30: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
ef40: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
ef50: 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
ef60: 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  ack */.  i64 *pO
ef70: 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
ef80: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
ef90: 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
efa0: 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  ayback */.  Bitv
efb0: 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20  ec *pDone,      
efc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
efd0: 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
efe0: 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
eff0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
f000: 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
f010: 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
f020: 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
f030: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
f040: 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20   int isSavepnt  
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f060: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76  * True for a sav
f070: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
f080: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
f090: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0b0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
f0c0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
f0d0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
f100: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
f110: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
f120: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f140: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
f150: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
f160: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ing */.  char *a
f170: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
f180: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
f190: 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
f1a0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
f1b0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f1d0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
f1e0: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
f1f0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
f200: 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20   isSynced;      
f210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
f220: 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61  ue if journal pa
f230: 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  ge is synced */.
f240: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
f250: 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
f260: 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
f270: 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
f280: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
f290: 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
f2a0: 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
f2b0: 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
f2c0: 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
f2d0: 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
f2e0: 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
f2f0: 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
f300: 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
f310: 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
f320: 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
f330: 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
f340: 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
f350: 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
f360: 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  ta = pPager->pTm
f370: 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
f380: 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
f390: 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
f3a0: 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
f3b0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
f3c0: 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ted */.  assert(
f3d0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
f3e0: 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d  ger)==0 || (!isM
f3f0: 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76  ainJrnl && isSav
f400: 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 52  epnt) );..  /* R
f410: 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
f420: 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74  ber and page dat
f430: 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  a from the journ
f440: 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
f450: 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74  l.  ** file. Ret
f460: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
f470: 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  e to the caller 
f480: 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
f490: 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66  ccurs..  */.  jf
f4a0: 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f  d = isMainJrnl ?
f4b0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
f4c0: 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72  Pager->sjfd;.  r
f4d0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
f4e0: 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70  fd, *pOffset, &p
f4f0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
f500: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
f510: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
f520: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
f530: 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
f540: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
f550: 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
f560: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f570: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
f580: 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
f590: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
f5a0: 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
f5b0: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
f5c0: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
f5d0: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
f5e0: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
f5f0: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
f600: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
f610: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
f620: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
f630: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
f640: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
f650: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
f660: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
f670: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
f680: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
f690: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
f6a0: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
f6b0: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
f6c0: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
f6d0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
f6e0: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
f6f0: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
f700: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
f710: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
f720: 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
f730: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f740: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
f750: 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
f760: 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
f770: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
f780: 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
f790: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f7a0: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
f7b0: 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
f7c0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
f7d0: 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
f7e0: 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
f7f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
f800: 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
f810: 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
f820: 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
f830: 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  8*)aData)!=cksum
f840: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f850: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
f860: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
f870: 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71  Done && (rc = sq
f880: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
f890: 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51  Done, pgno))!=SQ
f8a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
f8b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
f8c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f8d0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
f8e0: 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72  SERVED || pPager
f8f0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
f900: 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f  XCLUSIVE );..  /
f910: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
f920: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
f930: 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
f940: 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
f950: 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
f960: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
f970: 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
f980: 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
f990: 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
f9a0: 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
f9b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
f9c0: 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
f9d0: 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
f9e0: 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
f9f0: 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   An exception to
fa00: 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a   the above rule:
fa10: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
fa20: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
fa30: 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  ode.  ** and a p
fa40: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72  age is moved dur
fa50: 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ing an increment
fa60: 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74  al vacuum then t
fa70: 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a  he page may.  **
fa80: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70   not be in the p
fa90: 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65  ager cache. Late
faa0: 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r: if a malloc()
fab0: 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   or IO error occ
fac0: 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
fad0: 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c  a Movepage() cal
fae0: 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  l, then the page
faf0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74   may not be in t
fb00: 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69  he cache.  ** ei
fb10: 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e  ther. So the con
fb20: 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
fb30: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61   in the above pa
fb40: 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20  ragraph is not. 
fb50: 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65   ** assert()able
fb60: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
fb70: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
fb80: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
fb90: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
fba0: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
fbb0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
fbc0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
fbd0: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
fbe0: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20  ot dirty..  **. 
fbf0: 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
fc00: 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
fc10: 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
fc20: 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
fc30: 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
fc40: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
fc50: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
fc60: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
fc70: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fc80: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
fc90: 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
fca0: 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
fcb0: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
fcc0: 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
fcd0: 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
fce0: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
fcf0: 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
fd00: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
fd10: 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
fd20: 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
fd30: 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
fd40: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
fd50: 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
fd60: 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
fd70: 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
fd80: 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
fd90: 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
fda0: 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
fdb0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
fdc0: 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
fdd0: 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
fde0: 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
fdf0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
fe00: 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
fe10: 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
fe20: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
fe30: 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
fe40: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
fe50: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
fe60: 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
fe70: 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
fe80: 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
fe90: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
fea0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
feb0: 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
fec0: 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
fed0: 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
fee0: 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
fef0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
ff00: 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
ff10: 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
ff20: 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
ff30: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
ff40: 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
ff50: 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
ff60: 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
ff70: 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
ff80: 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
ff90: 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
ffa0: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
ffb0: 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
ffc0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
ffd0: 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
ffe0: 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
fff0: 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
10000 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
10010 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
10020 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
10030 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
10040 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
10050 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
10060 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
10070 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
10080 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
10090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
100a0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
100b0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
100c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
100d0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
100e0 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
100f0 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
10100 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
10110 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41  ",.           PA
10120 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
10130 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
10140 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
10150 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61  Size, (u8*)aData
10160 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69  ),.           (i
10170 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
10180 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
10190 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
101a0 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
101b0 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
101c0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
101d0 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20  || (*pOffset <= 
101e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
101f0 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
10200 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50    isSynced = (pP
10210 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
10220 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
10230 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a  EED_SYNC));.  }.
10240 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73    if( (pPager->s
10250 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
10260 55 53 49 56 45 29 0a 20 20 20 26 26 20 69 73 4f  USIVE).   && isO
10270 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
10280 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20     && isSynced. 
10290 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
102a0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
102b0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
102c0 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
102d0 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
102e0 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66  Pg!=0 && (pPg->f
102f0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
10300 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20  SYNC)!=0 );.    
10310 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
10320 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
10330 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10340 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
10350 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  fd, (u8*)aData, 
10360 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10370 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
10380 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
10390 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
103a0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
103b0 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
103c0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
103d0 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20  r->pBackup ){.  
103e0 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
103f0 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
10400 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
10410 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EM);.      sqlit
10420 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
10430 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
10440 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61  pgno, (u8*)aData
10450 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  );.      CODEC2(
10460 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
10470 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54  gno, 7, rc=SQLIT
10480 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b  E_NOMEM, aData);
10490 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
104a0 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
104b0 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
104c0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
104d0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
104e0 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
104f0 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
10500 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
10510 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
10520 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
10530 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
10540 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
10550 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
10560 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
10570 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
10580 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
10590 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
105a0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
105b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
105c0 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
105d0 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
105e0 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
105f0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
10600 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
10610 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
10620 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
10630 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
10640 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
10650 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
10660 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
10670 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
10680 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
10690 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
106a0 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
106b0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
106c0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
106d0 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
106e0 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
106f0 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
10700 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
10710 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
10720 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
10730 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
10740 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
10750 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
10760 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
10770 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
10780 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
10790 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
107a0 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
107b0 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
107c0 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
107d0 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
107e0 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
107f0 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
10800 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
10810 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
10820 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
10830 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
10840 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71      if( (rc = sq
10850 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
10860 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
10870 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49 54  &pPg, 1))!=SQLIT
10880 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
10890 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
108a0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
108b0 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
108c0 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
108d0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
108e0 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
108f0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
10900 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
10910 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
10920 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
10930 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
10940 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
10950 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
10960 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
10970 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
10980 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
10990 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
109a0 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
109b0 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
109c0 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
109d0 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
109e0 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
109f0 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
10a00 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
10a10 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
10a20 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
10a30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
10a40 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
10a50 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
10a60 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
10a70 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  a, (u8*)aData, p
10a80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
10a90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52  ;.    pPager->xR
10aa0 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
10ab0 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
10ac0 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
10ad0 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
10ae0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
10af0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10b00 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
10b10 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
10b20 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
10b30 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
10b40 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
10b50 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
10b60 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
10b70 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
10b80 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
10b90 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
10ba0 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
10bb0 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
10bc0 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
10bd0 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
10be0 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
10bf0 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
10c00 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
10c10 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
10c20 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ase..      **.  
10c30 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
10c40 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
10c50 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
10c60 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
10c70 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
10c80 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
10c90 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
10ca0 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
10cb0 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
10cc0 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
10cd0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
10ce0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
10cf0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
10d00 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
10d10 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
10d20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
10d30 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
10d40 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
10d50 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
10d60 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
10d70 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
10d80 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
10d90 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
10da0 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
10db0 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
10dc0 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
10dd0 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
10de0 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
10df0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
10e00 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
10e10 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
10e20 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
10e30 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
10e40 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
10e50 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
10e60 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
10e70 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
10e80 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
10e90 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
10ea0 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
10eb0 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
10ec0 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
10ed0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
10ee0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
10ef0 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
10f00 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
10f10 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
10f20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
10f30 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
10f40 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
10f50 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
10f60 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
10f70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
10f80 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
10f90 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
10fa0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
10fb0 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
10fc0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
10fd0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
10fe0 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
10ff0 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
11000 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
11010 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
11020 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
11030 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
11040 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
11050 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
11060 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
11070 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
11080 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
11090 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
110a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
110b0 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
110c0 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
110d0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
110e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
110f0 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
11100 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
11110 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
11120 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
11130 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20  , pPg->pgno, 3, 
11140 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
11150 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
11160 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
11170 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
11190 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
111a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
111b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
111c0 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
111d0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
111e0 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
111f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11200 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
11210 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
11220 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11230 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
11240 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
11250 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
11260 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
11270 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
11280 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
11290 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
112a0 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
112b0 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
112c0 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
112d0 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
112e0 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
112f0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
11300 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20  * When a master 
11310 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
11320 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70  created, it is p
11330 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
11340 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61  e names .** of a
11350 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
11360 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66  journals, one af
11370 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72  ter another, for
11380 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20  matted as utf-8 
11390 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74  .** encoded text
113a0 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63  . The end of eac
113b0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
113c0 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77  file is marked w
113d0 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65  ith a .** nul-te
113e0 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30  rminator byte (0
113f0 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65  x00). i.e. the e
11400 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
11410 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
11420 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61  al.** file for a
11430 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76   transaction inv
11440 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62  olving two datab
11450 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a  ases might be:.*
11460 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69  *.**   "/home/bi
11470 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/a.db-journal\
11480 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e  x00/home/bill/b.
11490 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a  db-journal\x00".
114a0 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a  **.** A master j
114b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
114c0 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20  only be deleted 
114d0 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  once all of its 
114e0 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61  child .** journa
114f0 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c  ls have been rol
11500 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
11510 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
11520 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ads the contents
11530 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
11540 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
11550 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
11560 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61  loops through ea
11570 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
11580 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46  journal names. F
11590 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64  or.** each child
115a0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65   journal, it che
115b0 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  cks if:.**.**   
115c0 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
115d0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61  ournal exists, a
115e0 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20  nd if so.**   * 
115f0 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
11600 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  rnal contains a 
11610 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73  reference to mas
11620 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  ter journal .** 
11630 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72      file zMaster
11640 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c  .**.** If a chil
11650 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
11660 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63   found that matc
11670 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20  hes both of the 
11680 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76  criteria.** abov
11690 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
116a0 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
116b0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
116c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
116d0 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20  * no such child 
116e0 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
116f0 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74  ound, file zMast
11700 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  er is deleted fr
11710 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  om.** the file-s
11720 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69  ystem using sqli
11730 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
11740 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
11750 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20  ror within this 
11760 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72  function, an err
11770 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
11780 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ned. This.** fun
11790 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
117a0 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
117b0 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
117c0 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74  ). If an allocat
117d0 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  ion.** fails, SQ
117e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
117f0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
11800 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d  e, if no IO or m
11810 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a  alloc errors .**
11820 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
11830 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
11840 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  *.** TODO: This 
11850 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
11860 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63  es a single bloc
11870 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c  k of memory to l
11880 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  oad.** the entir
11890 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
118a0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
118b0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c   file. This coul
118c0 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65  d be.** a couple
118d0 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72   of kilobytes or
118e0 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c   so - potentiall
118f0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  y larger than th
11900 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e  e page .** size.
11910 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
11920 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
11930 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
11940 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
11950 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
11960 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
11970 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
11980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11990 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
119a0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
119b0 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20  file *pMaster;  
119c0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61    /* Malloc'd ma
119d0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
119e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
119f0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
11a00 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d  pJournal;   /* M
11a10 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f  alloc'd child-jo
11a20 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
11a30 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  iptor */.  char 
11a40 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
11a50 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
11a60 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
11a70 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
11a80 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
11a90 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
11aa0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
11ab0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41   file */..  /* A
11ac0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
11ad0 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
11ae0 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
11af0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
11b00 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
11b10 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
11b20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11b30 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
11b40 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
11b50 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
11b60 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
11b70 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
11b80 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
11b90 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
11ba0 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
11bb0 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
11bc0 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
11bd0 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
11be0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
11bf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
11c00 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
11c10 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
11c20 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
11c30 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
11c40 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
11c50 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
11c60 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
11c70 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
11c80 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
11c90 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
11ca0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72  master_out;..  r
11cb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
11cc0 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
11cd0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
11ce0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11cf0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
11d00 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
11d10 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
11d20 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
11d30 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
11d40 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
11d50 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73   0;.    int nMas
11d60 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
11d70 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20  xPathname+1;..  
11d80 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
11d90 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
11da0 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
11db0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
11dc0 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
11dd0 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
11de0 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
11df0 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
11e00 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
11e10 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
11e20 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73  Malloc((int)nMas
11e30 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
11e40 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20  sterPtr + 1);.  
11e50 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
11e60 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
11e70 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
11e80 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  ;.      goto del
11e90 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
11ea0 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72  }.    zMasterPtr
11eb0 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
11ec0 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
11ed0 6c 2b 31 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73  l+1];.    rc = s
11ee0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
11ef0 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
11f00 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74  rnal, (int)nMast
11f10 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
11f20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11f30 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
11f40 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7a  aster_out;.    z
11f50 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
11f60 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
11f70 30 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  0;..    zJournal
11f80 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
11f90 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
11fa0 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
11fb0 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
11fc0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
11fd0 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20  int exists;.    
11fe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11ff0 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f  Access(pVfs, zJo
12000 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
12010 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
12020 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69 66 28  ists);.      if(
12030 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12040 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
12050 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
12060 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12070 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
12080 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
12090 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
120a0 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
120b0 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
120c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
120d0 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
120e0 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
120f0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12100 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
12110 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
12120 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
12130 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12140 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
12150 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  .        int c;.
12160 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67          int flag
12170 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
12180 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
12190 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
121a0 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  AL);.        rc 
121b0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
121c0 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
121d0 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
121e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
121f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12200 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
12210 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
12220 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
12230 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
12240 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e  erJournal(pJourn
12250 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20  al, zMasterPtr, 
12260 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
12270 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
12280 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
12290 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
122a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
122b0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
122c0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
122d0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d    }..        c =
122e0 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
122f0 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
12300 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
12310 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ==0;.        if(
12320 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   c ){.          
12330 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
12340 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
12350 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
12360 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
12370 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
12380 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
12390 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
123a0 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
123b0 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
123c0 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
123d0 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63     }.  }.  .  rc
123e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
123f0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
12400 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  , 0);..delmaster
12410 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73  _out:.  if( zMas
12420 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
12430 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12440 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
12450 20 20 7d 20 20 0a 20 20 69 66 28 20 70 4d 61 73    }  .  if( pMas
12460 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
12470 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
12480 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
12490 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c  !isOpen(pJournal
124a0 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ) );.  }.  sqlit
124b0 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
124c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
124d0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
124e0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
124f0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74  o change the act
12500 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ual size of the 
12510 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
12520 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
12530 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20  stem. This only 
12540 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d  happens when com
12550 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
12560 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c  ction,.** or rol
12570 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e  ling back a tran
12580 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69  saction (includi
12590 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ng rolling back 
125a0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
125b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69  **.** If the mai
125c0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
125d0 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
125e0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
125f0 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64  k is not.** held
12600 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
12610 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
12620 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20  rwise, the size 
12630 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 0a 2a  of the file is.*
12640 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61  * changed to nPa
12650 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a  ge pages (nPage*
12660 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12670 20 62 79 74 65 73 29 2e 20 49 66 20 74 68 65 20   bytes). If the 
12680 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20  file.** on disk 
12690 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72  is currently lar
126a0 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70  ger than nPage p
126b0 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74  ages, then use t
126c0 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63  he VFS.** xTrunc
126d0 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20  ate() method to 
126e0 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a  truncate it..**.
126f0 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20  ** Or, it might 
12700 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
12710 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
12720 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
12730 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67  er than .** nPag
12740 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70  e pages. Some op
12750 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
12760 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
12770 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
12780 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74  if .** you try t
12790 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  o truncate a fil
127a0 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
127b0 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
127c0 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e  an it .** curren
127d0 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63  tly is, so detec
127e0 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
127f0 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
12800 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20  ero byte to .** 
12810 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
12820 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ew file instead.
12830 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
12840 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c  sful, return SQL
12850 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
12860 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
12870 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a  ile modifying.**
12880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12890 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  le, return the e
128a0 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
128b0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
128c0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
128d0 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
128e0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
128f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12900 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
12910 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
12920 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
12930 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
12940 64 29 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75  d) ){.    i64 cu
12950 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69  rrentSize, newSi
12960 7a 65 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  ze;.    /* TODO:
12970 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75   Is it safe to u
12980 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  se Pager.dbFileS
12990 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20  ize here? */.   
129a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
129b0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
129c0 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65  fd, &currentSize
129d0 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  );.    newSize =
129e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
129f0 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20  e*(i64)nPage;.  
12a00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12a10 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69  _OK && currentSi
12a20 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ze!=newSize ){. 
12a30 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74       if( current
12a40 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a  Size>newSize ){.
12a50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12a60 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
12a70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69  Pager->fd, newSi
12a80 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
12a90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
12aa0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
12ab0 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c  ager->fd, "", 1,
12ac0 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20   newSize-1);.   
12ad0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
12ae0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12af0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
12b00 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
12b10 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
12b20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
12b30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
12b40 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
12b50 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
12b60 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74  e variable for t
12b70 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65  he given.** page
12b80 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76  r based on the v
12b90 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
12ba0 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
12bb0 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68   method.** of th
12bc0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
12bd0 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72  file. The sector
12be0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73   size will be us
12bf0 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64  ed used .** to d
12c00 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
12c10 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20  e and alignment 
12c20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
12c30 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72  r and .** master
12c40 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
12c50 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64  s within created
12c60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
12c70 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
12c80 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66  ary files the ef
12c90 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
12ca0 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31  ize is always 51
12cb0 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  2 bytes..**.** O
12cc0 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f  therwise, for no
12cd0 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n-temporary file
12ce0 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  s, the effective
12cf0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a   sector size is.
12d00 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  ** the value ret
12d10 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
12d20 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f  ctorSize() metho
12d30 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  d rounded up to 
12d40 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c  32 if.** it is l
12d50 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20  ess than 32, or 
12d60 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20  rounded down to 
12d70 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
12d80 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61  if it.** is grea
12d90 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43  ter than MAX_SEC
12da0 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61  TOR_SIZE..*/.sta
12db0 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
12dc0 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
12dd0 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
12de0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
12df0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
12e00 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66  empFile );..  if
12e10 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
12e20 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  ile ){.    /* Se
12e30 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
12e40 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
12e50 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
12e60 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
12e70 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
12e80 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
12e90 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
12ea0 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
12eb0 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
12ec0 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20  ill segfault..  
12ed0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
12ee0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
12ef0 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
12f00 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
12f10 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
12f20 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33 32 20 29  >sectorSize<32 )
12f30 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
12f40 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
12f50 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
12f60 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58  ->sectorSize>MAX
12f70 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a  _SECTOR_SIZE ){.
12f80 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f      assert( MAX_
12f90 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32  SECTOR_SIZE>=512
12fa0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
12fb0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58  sectorSize = MAX
12fc0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
12fd0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
12fe0 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
12ff0 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
13000 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13010 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
13020 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
13030 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
13040 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
13050 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
13060 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
13070 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
13080 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
13090 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
130a0 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
130b0 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
130c0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
130d0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
130e0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
130f0 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
13100 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
13110 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
13120 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
13130 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
13140 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
13150 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
13160 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
13170 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
13180 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
13190 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
131a0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
131b0 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
131c0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
131d0 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
131e0 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
131f0 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
13200 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
13210 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
13220 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
13230 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
13240 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
13250 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
13260 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
13270 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
13280 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
13290 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
132a0 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
132b0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
132c0 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
132d0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
132e0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
132f0 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
13300 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
13310 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
13320 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
13330 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
13340 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
13350 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
13360 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
13370 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
13380 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
13390 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
133a0 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
133b0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
133c0 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
133d0 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
133e0 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
133f0 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
13400 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
13410 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
13420 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
13430 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
13440 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
13450 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
13460 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
13470 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
13480 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
13490 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
134a0 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
134b0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
134c0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
134d0 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
134e0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
134f0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
13500 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
13510 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13520 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
13530 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
13540 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
13550 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
13560 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
13570 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
13580 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
13590 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
135a0 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
135b0 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
135c0 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
135d0 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
135e0 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
135f0 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
13600 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
13610 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
13620 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
13630 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
13640 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
13650 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
13660 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
13670 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
13680 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
13690 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
136a0 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
136b0 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
136c0 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
136d0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
136e0 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
136f0 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
13700 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
13710 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
13720 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
13730 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
13740 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
13750 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
13760 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
13770 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
13780 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
13790 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
137a0 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
137b0 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
137c0 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
137d0 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
137e0 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
137f0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
13800 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
13810 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
13820 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
13830 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
13840 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
13850 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
13860 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
13870 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
13880 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
13890 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
138a0 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
138b0 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
138c0 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
138d0 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
138e0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
138f0 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
13900 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
13910 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
13920 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
13930 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
13940 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
13950 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
13960 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
13970 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
13980 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
13990 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
139a0 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
139b0 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
139c0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
139d0 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
139e0 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
139f0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
13a00 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
13a10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
13a20 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
13a30 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
13a40 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
13a50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
13a60 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
13a70 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
13a80 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
13a90 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
13aa0 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
13ab0 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
13ac0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
13ad0 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
13ae0 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
13af0 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
13b00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13b10 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
13b20 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
13b30 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
13b40 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
13b50 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
13b60 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
13b70 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
13b80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13b90 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
13ba0 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
13bb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13bc0 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
13bd0 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
13be0 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
13bf0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
13c00 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
13c10 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
13c20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
13c30 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
13c40 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
13c50 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
13c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13c70 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
13c80 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
13c90 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
13ca0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
13cb0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
13cc0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
13cd0 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
13ce0 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
13cf0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
13d00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
13d10 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
13d20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
13d30 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
13d40 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
13d50 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
13d60 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a  ge rollback */..
13d70 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
13d80 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
13d90 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
13da0 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
13db0 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
13dc0 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
13dd0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
13de0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13df0 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  d) );.  rc = sql
13e00 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
13e10 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
13e20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
13e30 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30  ITE_OK || szJ==0
13e40 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
13e50 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
13e60 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
13e70 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
13e80 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
13e90 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
13ea0 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
13eb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
13ec0 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
13ed0 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
13ee0 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
13ef0 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
13f00 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
13f10 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
13f20 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
13f30 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
13f40 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   back..  **.  **
13f50 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c   TODO: Technical
13f60 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
13f70 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63   is an error bec
13f80 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20  ause it assumes 
13f90 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  that.  ** buffer
13fa0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
13fb0 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b   is (mxPathname+
13fc0 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67  1) bytes or larg
13fd0 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20  er. i.e. that.  
13fe0 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ** (pPager->page
13ff0 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e  Size >= pPager->
14000 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
14010 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e  +1). Using os_un
14020 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61  ix.c,.  **  mxPa
14030 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77  thname is 512, w
14040 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65  hich is the same
14050 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   as the minimum 
14060 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a  allowable value.
14070 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a    ** for pageSiz
14080 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  e..  */.  zMaste
14090 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
140a0 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
140b0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
140c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
140d0 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
140e0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
140f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
14100 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
14110 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
14120 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
14130 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
14140 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
14150 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
14160 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
14170 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14180 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
14190 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
141a0 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
141b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
141c0 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52   0;.  needPagerR
141d0 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20  eset = isHot;.. 
141e0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
141f0 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
14200 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e  when a readJourn
14210 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a  alHdr() or .  **
14220 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
14230 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20  one_page() call 
14240 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
14250 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
14260 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e  or .  ** occurs.
14270 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20   .  */.  while( 
14280 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64  1 ){.    /* Read
14290 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
142a0 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
142b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
142c0 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
142d0 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
142e0 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
142f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
14300 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
14310 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
14320 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
14330 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
14340 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77  must of failed w
14350 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
14360 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
14370 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
14380 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
14390 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
143a0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
143b0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
143c0 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20  er, isHot, szJ, 
143d0 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
143e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
143f0 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
14400 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
14410 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
14420 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14430 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
14440 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
14450 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
14460 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
14470 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
14480 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
14490 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
144a0 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
144b0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
144c0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
144d0 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
144e0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
144f0 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
14500 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
14510 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
14520 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
14530 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
14540 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
14550 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
14560 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
14570 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
14580 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
14590 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
145a0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
145b0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
145c0 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
145d0 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
145e0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
145f0 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
14600 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
14610 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
14620 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
14630 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
14640 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
14650 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
14660 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
14670 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
14680 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
14690 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
146a0 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
146b0 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
146c0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
146d0 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
146e0 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
146f0 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
14700 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
14710 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
14720 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
14730 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
14740 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
14750 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
14760 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
14770 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
14780 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
14790 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
147a0 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
147b0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
147c0 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
147d0 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
147e0 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
147f0 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
14800 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
14810 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
14820 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
14830 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
14840 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
14850 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
14860 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
14870 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
14880 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
14890 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
148a0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
148b0 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
148c0 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
148d0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
148e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
148f0 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
14900 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
14910 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
14920 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
14930 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
14940 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
14950 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
14960 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
14970 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14980 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
14990 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
149a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
149b0 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
149c0 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
149d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
149e0 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
149f0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
14a00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
14a10 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
14a20 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
14a30 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
14a40 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
14a50 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
14a60 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
14a70 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
14a80 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
14a90 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
14aa0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
14ab0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
14ac0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
14ad0 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
14ae0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14af0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14b00 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
14b10 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
14b20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
14b30 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
14b40 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
14b50 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
14b60 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
14b70 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
14b80 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
14b90 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67   file and/or pag
14ba0 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a  e cache..    */.
14bb0 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e      for(u=0; u<n
14bc0 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20  Rec; u++){.     
14bd0 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65   if( needPagerRe
14be0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  set ){.        p
14bf0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
14c00 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64  r);.        need
14c10 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a  PagerReset = 0;.
14c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
14c30 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
14c40 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
14c50 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r,&pPager->journ
14c60 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20  alOff,0,1,0);.  
14c70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14c80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14c90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14ca0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
14cb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
14cd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14ce0 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
14cf0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
14d00 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
14d10 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
14d20 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
14d30 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
14d40 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75  nal has been tru
14d50 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73  ncated, simply s
14d60 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a  top reading and.
14d70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
14d80 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72  cessing the jour
14d90 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20  nal. This might 
14da0 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f  happen if the jo
14db0 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20  urnal was.      
14dc0 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c      ** not compl
14dd0 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e  etely written an
14de0 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  d synced prior t
14df0 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74  o a crash.  In t
14e00 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
14e10 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62   case, the datab
14e20 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ase should have 
14e30 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
14e40 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  en in the.      
14e50 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61      ** first pla
14e60 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74  ce so it is OK t
14e70 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e  o simply abandon
14e80 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a   the rollback. *
14e90 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
14ea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14eb0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
14ec0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
14ed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14ee0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
14ef0 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
14f00 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75  k, quit and retu
14f10 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  rn the error.   
14f20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20         ** code. 
14f30 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
14f40 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
14f50 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
14f60 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ate.          **
14f70 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74   so that no furt
14f80 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65  her harm will be
14f90 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20   done.  Perhaps 
14fa0 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20  the next.       
14fb0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f     ** process to
14fc0 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c   come along will
14fd0 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
14fe0 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
14ff0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
15000 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
15010 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
15020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15030 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
15040 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
15050 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
15060 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c  ayback:.  /* Fol
15070 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
15080 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
15090 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
150a0 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
150b0 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
150c0 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
150d0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
150e0 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
150f0 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
15100 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
15110 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
15120 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
15130 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
15140 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
15150 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
15160 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
15170 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20    */.  assert(. 
15180 20 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70     pPager->fd->p
15190 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20  Methods==0 ||.  
151a0 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
151b0 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
151c0 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  d,SQLITE_FCNTL_D
151d0 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d  B_UNCHANGED,0)>=
151e0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a  SQLITE_OK.  );..
151f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61    /* If this pla
15200 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69  yback is happeni
15210 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ng automatically
15220 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
15230 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d  an IO or .  ** m
15240 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74  alloc error that
15250 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20   occurred after 
15260 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
15270 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62  er was updated b
15280 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20  ut .  ** before 
15290 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
152a0 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  was committed, t
152b0 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hen the change-c
152c0 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64  ounter .  ** mod
152d0 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75  ification may ju
152e0 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76  st have been rev
152f0 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68  erted. If this h
15300 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73  appens in exclus
15310 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20  ive .  ** mode, 
15320 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
15330 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72  transactions per
15340 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f  formed by the co
15350 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  nnection will no
15360 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68  t.  ** update th
15370 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
15380 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61   at all. This ma
15390 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20  y lead to cache 
153a0 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20  inconsistency.  
153b0 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  ** problems for 
153c0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
153d0 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
153e0 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c   the future. So,
153f0 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61   just.  ** in ca
15400 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  se this has happ
15410 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20  ened, clear the 
15420 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
15430 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  flag now..  */. 
15440 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
15450 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
15460 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
15470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15480 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
15490 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
154a0 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
154b0 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
154c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
154d0 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
154e0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
154f0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
15500 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15510 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
15520 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
15530 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
15540 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
15550 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
15560 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  E ){.    rc = sq
15570 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
15580 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
15590 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d  sync_flags);.  }
155a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
155b0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
155c0 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  noSync==0 && pPa
155d0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
155e0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
155f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15600 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
15610 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
15620 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lags);.  }.  if(
15630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15640 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
15650 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
15660 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
15670 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20  [0]!='\0');.    
15680 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
15690 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
156a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
156b0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
156c0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
156d0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
156e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
156f0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
15700 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
15710 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
15720 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
15730 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
15740 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
15750 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
15760 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
15770 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
15780 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
15790 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
157a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
157b0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
157c0 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
157d0 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
157e0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
157f0 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
15800 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
15810 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
15820 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
15830 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
15840 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
15850 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
15860 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
15870 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
15880 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
15890 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
158a0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
158b0 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
158c0 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
158d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
158e0 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44  into .** pPg->pD
158f0 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f  ata. A shared lo
15900 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
15910 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  st be held on th
15920 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
15930 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
15940 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15950 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  d..**.** If page
15960 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e   1 is read, then
15970 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
15980 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
15990 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68   is set to.** th
159a0 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
159b0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
159c0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ile..**.** If an
159d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
159e0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
159f0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
15a00 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
15a10 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  * Otherwise, SQL
15a20 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
15a30 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15a40 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48  t readDbPage(PgH
15a50 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
15a60 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
15a70 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65  >pPager; /* Page
15a80 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  r object associa
15a90 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50  ted with page pP
15aa0 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
15ab0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20   = pPg->pgno;   
15ac0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
15ad0 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  er to read */.  
15ae0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15af0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
15b00 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
15b10 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20 30   int isInWal = 0
15b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15b30 20 54 72 75 65 20 69 66 20 70 61 67 65 20 69 73   True if page is
15b40 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a   in log file */.
15b50 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
15b60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
15b70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
15b80 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
15b90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15ba0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
15bb0 52 45 44 20 26 26 20 21 4d 45 4d 44 42 20 29 3b  RED && !MEMDB );
15bc0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
15bd0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
15be0 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21 69  ..  if( NEVER(!i
15bf0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
15c00 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  )) ){.    assert
15c10 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
15c20 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  le );.    memset
15c30 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
15c40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15c50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15c60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
15c70 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
15c80 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
15c90 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68  * Try to pull th
15ca0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
15cb0 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e  write-ahead log.
15cc0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
15cd0 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67  ite3WalRead(pPag
15ce0 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20  er->pWal, pgno, 
15cf0 26 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20  &isInWal, pgsz, 
15d00 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d  pPg->pData);.  }
15d10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15d20 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61 6c  E_OK && !isInWal
15d30 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66   ){.    i64 iOff
15d40 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
15d50 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
15d60 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
15d70 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
15d80 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44  ger->fd, pPg->pD
15d90 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73  ata, pgsz, iOffs
15da0 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  et);.    if( rc=
15db0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
15dc0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
15dd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
15de0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
15df0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
15e00 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
15e10 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64    /* If the read
15e20 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c   is unsuccessful
15e30 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65  , set the dbFile
15e40 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68  Vers[] to someth
15e50 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ing.      ** tha
15e60 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  t will never be 
15e70 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72  a valid file ver
15e80 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72  sion.  dbFileVer
15e90 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20  s[] is a copy.  
15ea0 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20      ** of bytes 
15eb0 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61  24..39 of the da
15ec0 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32  tabase.  Bytes 2
15ed0 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77  8..31 should alw
15ee0 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ays be.      ** 
15ef0 7a 65 72 6f 2e 20 20 42 79 74 65 73 20 33 32 2e  zero.  Bytes 32.
15f00 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 20 73  .35 and 35..39 s
15f10 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
15f20 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 0a  mbers which are.
15f30 20 20 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 30        ** never 0
15f40 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
15f50 69 6c 6c 69 6e 67 20 70 50 61 67 65 72 2d 3e 64  illing pPager->d
15f60 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
15f70 20 61 6c 6c 20 30 78 66 66 0a 20 20 20 20 20 20   all 0xff.      
15f80 2a 2a 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ** bytes should 
15f90 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
15fa0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
15fb0 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
15fc0 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
15fd0 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
15fe0 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
15ff0 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
16000 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
16010 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
16020 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
16030 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
16040 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61  ite noising equa
16050 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
16060 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
16070 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
16080 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
16090 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
160a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
160b0 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
160c0 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
160d0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
160e0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
160f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
16100 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
16110 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
16120 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
16130 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
16140 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
16150 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
16160 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
16170 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
16180 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
16190 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
161a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
161b0 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
161c0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
161d0 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
161e0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
161f0 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
16200 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
16210 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
16220 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
16230 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
16240 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
16250 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
16260 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
16270 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
16280 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
16290 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
162a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
162b0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
162c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
162d0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
162e0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
162f0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
16300 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
16310 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
16320 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
16330 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
16340 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
16350 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
16360 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16370 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
16380 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
16390 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
163a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
163b0 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
163c0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
163d0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
163e0 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
163f0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
16400 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
16410 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
16420 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
16430 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
16440 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
16450 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
16460 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
16470 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
16480 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
16490 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
164a0 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
164b0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
164c0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
164d0 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
164e0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
164f0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
16500 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
16510 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
16520 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
16530 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
16540 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
16550 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16560 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16570 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
16580 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
16590 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
165a0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
165b0 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
165c0 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
165d0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
165e0 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
165f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16600 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
16610 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16620 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
16630 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
16640 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16650 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
16660 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
16670 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
16680 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
16690 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ref(pPg);.    }.
166a0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
166b0 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
166c0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
166d0 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
166e0 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
166f0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
16700 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
16710 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
16720 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
16730 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
16740 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
16750 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
16760 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
16770 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
16780 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
16790 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
167a0 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
167b0 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
167c0 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
167d0 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
167e0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
167f0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
16800 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
16810 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
16820 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
16830 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
16840 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
16850 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
16860 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
16870 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
16880 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
16890 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
168a0 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
168b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
168c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
168d0 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
168e0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
168f0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
16900 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
16910 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
16920 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
16930 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16950 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
16960 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
16970 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
16980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
16990 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
169a0 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
169b0 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
169c0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
169d0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
169e0 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
169f0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
16a00 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
16a10 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
16a20 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
16a30 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
16a40 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
16a50 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
16a60 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
16a70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
16a80 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
16a90 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
16aa0 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
16ab0 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
16ac0 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
16ad0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
16ae0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
16af0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
16b00 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
16b10 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
16b20 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
16b30 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
16b40 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
16b50 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
16b60 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
16b70 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
16b80 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
16b90 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
16ba0 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
16bb0 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
16bc0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
16bd0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
16be0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
16bf0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
16c00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
16c10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
16c20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
16c30 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
16c40 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
16c50 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
16c60 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
16c70 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
16c80 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
16c90 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
16ca0 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
16cb0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
16cc0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
16cd0 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
16ce0 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
16cf0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
16d00 61 6e 67 65 64 2e 20 0a 2a 2f 20 0a 73 74 61 74  anged. .*/ .stat
16d10 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46  ic int pagerWalF
16d20 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a  rames(.  Pager *
16d30 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
16d40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
16d50 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
16d60 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  Hdr *pList,     
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d80 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20   List of frames 
16d90 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f  to log */.  Pgno
16da0 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20   nTruncate,     
16db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
16dc0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74  atabase size aft
16dd0 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a  er this commit *
16de0 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
16df0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16e00 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
16e10 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20  his is a commit 
16e20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 5f 66 6c  */.  int sync_fl
16e30 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
16e40 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
16e50 20 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28   pass to OsSync(
16e60 29 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20  ) (or 0) */.){. 
16e70 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e90 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
16ea0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
16eb0 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20  ager->pWal );.  
16ec0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
16ed0 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
16ee0 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
16ef0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
16f00 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
16f10 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 5f 66 6c  sCommit, sync_fl
16f20 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ags.  );.  if( r
16f30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16f40 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
16f50 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
16f60 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
16f70 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
16f80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16f90 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
16fa0 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
16fb0 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
16fc0 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
16fd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16fe0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 57  ../*.** Open a W
16ff0 41 4c 20 73 6e 61 70 73 68 6f 74 20 6f 6e 20 74  AL snapshot on t
17000 68 65 20 6c 6f 67 20 66 69 6c 65 20 74 68 69 73  he log file this
17010 20 70 61 67 65 72 20 69 73 20 63 6f 6e 6e 65 63   pager is connec
17020 74 65 64 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ted to..*/.stati
17030 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 53  c int pagerOpenS
17040 6e 61 70 73 68 6f 74 28 50 61 67 65 72 20 2a 70  napshot(Pager *p
17050 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
17060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
17080 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
17090 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
170b0 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
170c0 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
170d0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
170e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
170f0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
17100 33 57 61 6c 4f 70 65 6e 53 6e 61 70 73 68 6f 74  3WalOpenSnapshot
17110 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
17120 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20  changed);.  if( 
17130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17140 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a  .    int dummy;.
17150 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 64 20      if( changed 
17160 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
17170 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
17180 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17190 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70  er->errCode || p
171a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
171b0 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  id==0 );.    }. 
171c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
171d0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
171e0 61 67 65 72 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  ager, &dummy);. 
171f0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61   }.  pPager->sta
17200 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
17210 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  D;..  return rc;
17220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
17230 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
17240 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
17250 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
17260 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
17270 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 2e 20 41  ger.** exists. A
17280 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
17290 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 45   occurs, set *pE
172a0 78 69 73 74 73 20 74 6f 20 31 20 69 66 20 74 68  xists to 1 if th
172b0 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 0a 2a  e file exists,.*
172c0 2a 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65  * or 0 otherwise
172d0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
172e0 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
172f0 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  or OOM error occ
17300 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  urs, return.** a
17310 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
17320 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
17330 6e 74 20 70 61 67 65 72 48 61 73 57 41 4c 28 50  nt pagerHasWAL(P
17340 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
17350 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 69  t *pExists){.  i
17360 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17380 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
17390 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
173a0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
173b0 20 63 68 61 72 20 2a 7a 57 61 6c 20 3d 20 73 71   char *zWal = sq
173c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
173d0 73 2d 77 61 6c 22 2c 20 70 50 61 67 65 72 2d 3e  s-wal", pPager->
173e0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
173f0 69 66 28 20 21 7a 57 61 6c 20 29 7b 0a 20 20 20  if( !zWal ){.   
17400 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17410 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
17420 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17430 74 65 33 4f 73 41 63 63 65 73 73 28 70 50 61 67  te3OsAccess(pPag
17440 65 72 2d 3e 70 56 66 73 2c 20 7a 57 61 6c 2c 20  er->pVfs, zWal, 
17450 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
17460 49 53 54 53 2c 20 70 45 78 69 73 74 73 29 3b 0a  ISTS, pExists);.
17470 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
17480 65 65 28 7a 57 61 6c 29 3b 0a 20 20 20 20 7d 0a  ee(zWal);.    }.
17490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
174a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
174b0 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
174c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
174d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
174e0 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
174f0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
17500 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
17510 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67  e opened by pPag
17520 65 72 0a 2a 2a 20 65 78 69 73 74 73 2e 20 49 66  er.** exists. If
17530 20 69 74 20 64 6f 65 73 2c 20 6f 70 65 6e 20 74   it does, open t
17540 68 65 20 70 61 67 65 72 20 69 6e 20 57 41 4c 20  he pager in WAL 
17550 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  mode. Otherwise,
17560 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
17570 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
17580 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
17590 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
175a0 6f 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  o PAGER_JOURNALM
175b0 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 20 49 66 20 61  ODE_WAL..** If a
175c0 6e 20 49 4f 20 6f 72 20 4f 4f 4d 20 65 72 72 6f  n IO or OOM erro
175d0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
175e0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
175f0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   code..**.** If 
17600 74 68 65 20 57 41 4c 20 66 69 6c 65 20 69 73 20  the WAL file is 
17610 6f 70 65 6e 65 64 2c 20 61 6c 73 6f 20 6f 70 65  opened, also ope
17620 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 28 72 65  n a snapshot (re
17630 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  ad transaction).
17640 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
17650 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48  r must hold a SH
17660 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
17670 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
17680 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66  o call this.** f
17690 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65  unction. Because
176a0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
176b0 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  ck on the db fil
176c0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  e is required to
176d0 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41   delete .** a WA
176e0 4c 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  L, this ensures 
176f0 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65  there is no race
17700 20 63 6f 6e 64 69 74 69 6f 6e 20 62 65 74 77 65   condition betwe
17710 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29  en the xAccess()
17720 20 0a 2a 2a 20 62 65 6c 6f 77 20 61 6e 64 20 61   .** below and a
17730 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e  n xDelete() bein
17740 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f  g executed by so
17750 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
17760 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
17770 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  nt pagerOpenWalI
17780 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a  fPresent(Pager *
17790 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
177a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
177b0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
177c0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
177d0 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20  t isWal;        
177e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
177f0 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20  rue if WAL file 
17800 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 72 63  exists */.    rc
17810 20 3d 20 70 61 67 65 72 48 61 73 57 41 4c 28 70   = pagerHasWAL(p
17820 50 61 67 65 72 2c 20 26 69 73 57 61 6c 29 3b 0a  Pager, &isWal);.
17830 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
17850 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20  f( isWal ){.    
17860 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
17870 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
17880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17890 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72  erOpenWal(pPager
178a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
178b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
178c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
178d0 3d 20 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73  = pagerOpenSnaps
178e0 68 6f 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  hot(pPager);.   
178f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
17900 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
17910 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
17920 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
17930 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  L ){.        pPa
17940 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
17950 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
17960 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  MODE_DELETE;.   
17970 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17980 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
17990 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ndif../*.** Play
179a0 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
179b0 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
179c0 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
179d0 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
179e0 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
179f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17a00 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
17a10 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
17a20 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
17a30 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
17a40 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
17a50 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
17a60 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
17a70 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
17a80 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
17a90 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
17aa0 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
17ab0 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
17ac0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
17ad0 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
17ae0 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
17af0 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
17b00 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
17b10 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
17b20 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
17b30 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
17b40 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
17b50 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
17b60 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
17b70 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
17b80 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
17b90 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
17ba0 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
17bb0 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
17bc0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
17bd0 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
17be0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
17bf0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
17c00 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
17c10 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
17c20 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
17c30 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
17c40 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
17c50 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
17c60 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
17c70 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
17c80 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
17c90 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
17ca0 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
17cb0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
17cc0 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
17cd0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
17ce0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
17cf0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
17d00 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
17d10 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
17d20 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
17d30 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
17d40 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
17d50 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
17d60 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
17d70 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
17d80 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
17d90 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
17da0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
17db0 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
17dc0 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
17dd0 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
17de0 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
17df0 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
17e00 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
17e10 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
17e20 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
17e30 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
17e40 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
17e50 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
17e60 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
17e70 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
17e80 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
17e90 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
17ea0 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
17eb0 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
17ec0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
17ed0 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
17ee0 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
17ef0 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
17f00 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
17f10 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
17f20 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
17f30 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
17f40 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
17f50 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
17f60 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
17f70 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
17f80 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
17f90 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
17fa0 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
17fb0 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
17fc0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
17fd0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
17fe0 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
17ff0 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
18000 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
18010 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
18020 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
18030 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
18040 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
18050 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
18060 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
18070 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
18080 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
18090 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
180a0 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
180b0 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
180c0 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
180d0 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
180e0 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
180f0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
18100 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
18110 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
18120 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
18130 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
18140 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
18150 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
18160 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
18170 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
18180 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
18190 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
181a0 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
181b0 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
181c0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
181d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
181e0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
181f0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
18200 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f  bitvec to use to
18210 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
18220 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  f pages rolled b
18230 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ack */.  if( pSa
18240 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70  vepoint ){.    p
18250 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69  Done = sqlite3Bi
18260 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65  tvecCreate(pSave
18270 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20  point->nOrig);. 
18280 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b     if( !pDone ){
18290 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
182a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
182b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
182c0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
182d0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
182e0 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72  lue it was befor
182f0 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  e the savepoint 
18300 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65  .  ** being reve
18310 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e  rted was opened.
18320 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
18330 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f  dbSize = pSavepo
18340 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  int ? pSavepoint
18350 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72  ->nOrig : pPager
18360 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20  ->dbOrigSize;.. 
18370 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74   if( !pSavepoint
18380 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
18390 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
183a0 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62  eturn pagerRollb
183b0 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a  ackWal(pPager);.
183c0 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50    }..  /* Use pP
183d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
183e0 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
183f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
18400 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
18410 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
18420 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
18430 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
18440 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
18450 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
18460 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
18470 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
18480 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
18490 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
184a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
184b0 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
184c0 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
184d0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
184e0 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  alOff;.  assert(
184f0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
18500 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d  ger)==0 || szJ==
18510 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
18520 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   by rolling back
18530 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
18540 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
18550 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
18560 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
18570 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
18580 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  nuing to the nex
18590 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
185a0 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67  ..  ** There mig
185b0 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e  ht be records in
185c0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
185d0 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  l that have a pa
185e0 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67  ge number.  ** g
185f0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
18600 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
18610 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64   size (pPager->d
18620 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65  bSize) but those
18630 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
18640 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ipped automatica
18650 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20  lly.  Pages are 
18660 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61  added to pDone a
18670 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20  s they.  ** are 
18680 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
18690 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
186a0 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57  nt && !pagerUseW
186b0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
186c0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
186d0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
186e0 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
186f0 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
18700 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
18710 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
18720 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
18730 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
18740 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
18750 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
18760 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
18770 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
18780 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
18790 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
187a0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
187b0 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
187c0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
187d0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
187e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
187f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
18800 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  0;.  }..  /* Con
18810 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61  tinue rolling ba
18820 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f  ck records out o
18830 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
18840 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
18850 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f   ** the first jo
18860 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65  urnal header see
18870 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  n and continuing
18880 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63   until the effec
18890 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  tive end.  ** of
188a0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
188b0 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75  l file.  Continu
188c0 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66  e to skip out-of
188d0 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64  -range pages and
188e0 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  .  ** continue a
188f0 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c  dding pages roll
18900 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65  ed back to pDone
18910 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
18920 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18930 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18940 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75  Off<szJ ){.    u
18950 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
18960 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18970 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52  r */.    u32 nJR
18980 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  ec = 0;     /* N
18990 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
189a0 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
189b0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
189c0 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
189d0 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a  dr(pPager, 0, sz
189e0 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
189f0 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
18a00 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
18a10 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
18a20 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a  * The "pPager->j
18a30 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
18a40 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
18a50 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
18a60 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73  lOff".    ** tes
18a70 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20  t is related to 
18a80 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53  ticket #2565.  S
18a90 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f  ee the discussio
18aa0 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  n in the.    ** 
18ab0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
18ac0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
18ad0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
18ae0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
18af0 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20   if( nJRec==0 . 
18b00 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
18b10 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
18b20 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
18b30 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
18b40 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  lOff.    ){.    
18b50 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28    nJRec = (u32)(
18b60 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
18b70 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e  ournalOff)/JOURN
18b80 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
18b90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
18ba0 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
18bb0 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63  E_OK && ii<nJRec
18bc0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
18bd0 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b  nalOff<szJ; ii++
18be0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
18bf0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
18c00 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
18c10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
18c20 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
18c30 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18c40 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
18c50 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  NE );.  }.  asse
18c60 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
18c70 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K || pPager->jou
18c80 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a  rnalOff==szJ );.
18c90 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20  .  /* Finally,  
18ca0 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66  rollback pages f
18cb0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
18cc0 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20  nal.  Page that 
18cd0 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f  were.  ** previo
18ce0 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  usly rolled back
18cf0 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
18d00 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72   journal (and ar
18d10 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65  e hence in pDone
18d20 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  ).  ** will be s
18d30 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d  kipped.  Out-of-
18d40 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20  range pages are 
18d50 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20  also skipped..  
18d60 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
18d70 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69  int ){.    u32 i
18d80 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
18d90 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
18da0 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
18db0 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  = pSavepoint->iS
18dc0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
18dd0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
18de0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
18df0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
18e00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
18e10 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70  lSavepointUndo(p
18e20 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61  Pager->pWal, pSa
18e30 76 65 70 6f 69 6e 74 2d 3e 69 46 72 61 6d 65 29  vepoint->iFrame)
18e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
18e50 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
18e60 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
18e70 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
18e80 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
18e90 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
18ea0 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b  ( offset==ii*(4+
18eb0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18ec0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
18ed0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
18ee0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
18ef0 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20  &offset, pDone, 
18f00 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 1);.    }.   
18f10 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
18f20 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
18f30 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
18f40 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a  Destroy(pDone);.
18f50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18f60 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
18f70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
18f80 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  szJ;.  }..  retu
18f90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18fa0 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
18fb0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
18fc0 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
18fd0 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
18fe0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
18ff0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
19000 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
19010 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71  nt mxPage){.  sq
19020 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61  lite3PcacheSetCa
19030 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
19040 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29  pPCache, mxPage)
19050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
19060 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
19070 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19080 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
19090 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
190a0 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
190b0 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
190c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
190d0 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
190e0 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
190f0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
19100 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
19110 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
19120 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
19130 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
19140 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
19150 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
19170 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
19180 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
19190 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
191a0 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
191b0 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
191c0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
191d0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
191e0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
191f0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
19200 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
19210 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
19230 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
19240 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
19250 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
19260 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
19270 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
19280 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
19290 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
192a0 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
192b0 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
192c0 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
192d0 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
192e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
192f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
19300 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
19310 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
19320 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
19330 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
19340 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
19350 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
19360 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19370 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
19380 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
19390 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
193a0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
193c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
193d0 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
193e0 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
193f0 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
19400 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
19410 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
19420 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
19430 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
19440 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
19450 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
19460 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
19470 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19480 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
19490 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
194a0 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
194b0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
194c0 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
194d0 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
194e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
194f0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
19500 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
19510 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
19520 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
19530 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
19540 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
19550 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
19560 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19570 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
19580 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
19590 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61  etSafetyLevel(Pa
195a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
195b0 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c   level, int bFul
195c0 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65  lFsync){.  pPage
195d0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65  r->noSync =  (le
195e0 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
195f0 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
19600 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
19610 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33  Sync = (level==3
19620 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
19630 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
19640 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
19650 73 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f  s = (bFullFsync?
19660 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
19670 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  :SQLITE_SYNC_NOR
19680 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  MAL);.  if( pPag
19690 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
196a0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
196b0 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
196c0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
196d0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
196e0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
196f0 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
19700 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
19710 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
19720 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
19730 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
19740 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
19750 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
19760 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
19770 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
19780 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
19790 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
197a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
197b0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
197c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
197d0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
197e0 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
197f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
19800 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
19810 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
19820 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
19830 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
19840 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
19850 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
19860 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
19870 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
19880 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
19890 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
198a0 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
198b0 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
198c0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
198d0 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
198e0 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
198f0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
19900 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
19910 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
19920 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
19930 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
19940 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
19950 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
19960 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
19970 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
19980 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
19990 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
199a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
199b0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
199c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
199d0 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
199e0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
199f0 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
19a00 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
19a10 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
19a20 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
19a30 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
19a40 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
19a50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
19a60 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
19a70 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
19a80 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
19a90 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
19aa0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
19ab0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
19ac0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
19ad0 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
19ae0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
19af0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
19b00 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
19b10 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
19b20 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
19b30 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
19b40 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
19b50 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
19b60 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
19b70 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
19b80 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
19b90 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
19ba0 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65  n(pFile) );.  re
19bb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19bc0 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
19bd0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
19be0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
19bf0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73   invokes the bus
19c00 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c  y-handler if sql
19c10 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74  ite3OsLock() ret
19c20 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
19c30 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67  BUSY when trying
19c40 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
19c50 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48   no-lock to a SH
19c60 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72  ARED lock,.** or
19c70 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
19c80 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
19c90 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
19ca0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a  an EXCLUSIVE .**
19cb0 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a   lock. It does *
19cc0 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  not* invoke the 
19cd0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
19ce0 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
19cf0 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45  .** SHARED to RE
19d00 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20  SERVED, or when 
19d10 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53  upgrading from S
19d20 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49  HARED to EXCLUSI
19d30 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63  VE.** (which occ
19d40 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  urs during hot-j
19d50 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
19d60 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a  . Summary:.**.**
19d70 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20     Transition   
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d90 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78       | Invokes x
19da0 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20  BusyHandler.**  
19db0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
19dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e  ---------.**   N
19df0 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20  O_LOCK       -> 
19e00 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
19e10 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52   | Yes.**   SHAR
19e20 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53  ED_LOCK   -> RES
19e30 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20  ERVED_LOCK    | 
19e40 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  No.**   SHARED_L
19e50 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49  OCK   -> EXCLUSI
19e60 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a  VE_LOCK   | No.*
19e70 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  *   RESERVED_LOC
19e80 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c  K -> EXCLUSIVE_L
19e90 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a  OCK   | Yes.**.*
19ea0 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61  * If the busy-ha
19eb0 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72  ndler callback r
19ec0 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
19ed0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   the lock is .**
19ee0 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20   retried. If it 
19ef0 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68  returns zero, th
19f00 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  en the SQLITE_BU
19f10 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72  SY error is.** r
19f20 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
19f30 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67  aller of the pag
19f40 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
19f50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19f60 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
19f70 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
19f80 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
19f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
19fa0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
19fb0 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
19fc0 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20  ler)(void *),   
19fd0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
19fe0 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
19ff0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
1a000 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
1a010 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  rArg            
1a020 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
1a030 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
1a040 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a  Handler */.){  .
1a050 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
1a060 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
1a070 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
1a080 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
1a090 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
1a0a0 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  rg;.}../*.** Rep
1a0b0 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  ort the current 
1a0c0 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75  page size and nu
1a0d0 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
1a0e0 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74   bytes back.** t
1a0f0 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a  o the codec..*/.
1a100 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
1a110 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76  S_CODEC.static v
1a120 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53  oid pagerReportS
1a130 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
1a140 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
1a150 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
1a160 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1a170 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70  xCodecSizeChng(p
1a180 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70  Pager->pCodec, p
1a190 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1a1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
1a1c0 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76  )pPager->nReserv
1a1d0 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  e);.  }.}.#else.
1a1e0 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65  # define pagerRe
1a1f0 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20  portSize(X)     
1a200 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64  /* No-op if we d
1a210 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20  o not support a 
1a220 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a  codec */.#endif.
1a230 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
1a240 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64  e page size used
1a250 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62   by the Pager ob
1a260 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61  ject. The new pa
1a270 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70  ge size .** is p
1a280 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53  assed in *pPageS
1a290 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
1a2a0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
1a2b0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  e error state wh
1a2c0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1a2d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a   is called, it.*
1a2e0 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68  * is a no-op. Th
1a2f0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1a300 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74   is the error st
1a310 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28  ate error code (
1a320 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20  i.e. .** one of 
1a330 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
1a340 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20  LITE_CORRUPT or 
1a350 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a  SQLITE_FULL)..**
1a360 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1a370 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
1a380 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1a390 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e  .**.**   * the n
1a3a0 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61  ew page size (va
1a3b0 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a  lue of *pPageSiz
1a3c0 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70  e) is valid (a p
1a3d0 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20  ower .**     of 
1a3e0 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20  two between 512 
1a3f0 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  and SQLITE_MAX_P
1a400 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73  AGE_SIZE, inclus
1a410 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ive), and.**.** 
1a420 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f    * there are no
1a430 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
1a440 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e  e references, an
1a450 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  d.**.**   * the 
1a460 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68  database is eith
1a470 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  er not an in-mem
1a480 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20  ory database or 
1a490 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20  it is.**     an 
1a4a0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1a4b0 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  se that currentl
1a4c0 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  y consists of ze
1a4d0 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ro pages..**.** 
1a4e0 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f  then the pager o
1a4f0 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20  bject page size 
1a500 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65  is set to *pPage
1a510 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
1a520 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
1a530 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68  changed, then th
1a540 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  is function uses
1a550 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c   sqlite3PagerMal
1a560 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74  loc() .** to obt
1a570 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e  ain a new Pager.
1a580 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
1a590 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61  . If this alloca
1a5a0 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a  tion attempt .**
1a5b0 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
1a5c0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
1a5d0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69   and the page si
1a5e0 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61  ze remains uncha
1a5f0 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c  nged. .** In all
1a600 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51   other cases, SQ
1a610 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1a620 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
1a630 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
1a640 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68  ot changed, eith
1a650 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  er because one o
1a660 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64  f the enumerated
1a670 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
1a680 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65  bove is not true
1a690 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  , the pager was 
1a6a0 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
1a6b0 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hen this.** func
1a6c0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c  tion was called,
1a6d0 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
1a6e0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1a6f0 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64  n attempt failed
1a700 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67  , .** then *pPag
1a710 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  eSize is set to 
1a720 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65  the old, retaine
1a730 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f  d page size befo
1a740 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1a750 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1a760 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
1a770 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20  er *pPager, u16 
1a780 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  *pPageSize, int 
1a790 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74  nReserve){.  int
1a7a0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
1a7b0 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 72 63  rCode;..  if( rc
1a7c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a7d0 20 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20     u16 pageSize 
1a7e0 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20  = *pPageSize;.  
1a7f0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
1a800 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
1a810 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
1a820 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
1a830 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
1a840 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d    if( (pPager->m
1a850 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65  emDb==0 || pPage
1a860 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20  r->dbSize==0).  
1a870 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
1a880 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
1a890 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
1a8a0 0a 20 20 20 20 20 26 26 20 70 61 67 65 53 69 7a  .     && pageSiz
1a8b0 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70  e && pageSize!=p
1a8c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1a8d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68  .    ){.      ch
1a8e0 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72  ar *pNew = (char
1a8f0 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61   *)sqlite3PageMa
1a900 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
1a910 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20        if( !pNew 
1a920 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a930 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1a940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a950 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1a960 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1a970 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a980 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
1a990 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1a9a0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
1a9b0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  pSpace);.       
1a9c0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1a9d0 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
1a9e0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1a9f0 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67  SetPageSize(pPag
1aa00 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
1aa10 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
1aa20 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65      }.    *pPage
1aa30 53 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67  Size = (u16)pPag
1aa40 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
1aa50 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
1aa60 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
1aa70 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
1aa80 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
1aa90 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
1aaa0 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
1aab0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
1aac0 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
1aad0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
1aae0 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
1aaf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ab00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ab10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1ab20 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
1ab30 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
1ab40 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
1ab50 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
1ab60 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
1ab70 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
1ab80 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
1ab90 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
1aba0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
1abb0 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
1abc0 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
1abd0 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
1abe0 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
1abf0 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
1ac00 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
1ac10 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
1ac20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
1ac30 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
1ac40 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
1ac50 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
1ac60 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
1ac70 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
1ac80 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
1ac90 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1aca0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1acb0 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
1acc0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1acd0 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
1ace0 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
1acf0 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
1ad00 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
1ad10 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
1ad20 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
1ad30 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
1ad40 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
1ad50 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
1ad60 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
1ad70 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1ad80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1ad90 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
1ada0 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
1adb0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
1adc0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
1add0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1ade0 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
1adf0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
1ae00 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
1ae10 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 69    int nPage;.  i
1ae20 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
1ae30 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
1ae40 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
1ae50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1ae60 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1ae70 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
1ae80 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1ae90 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
1aea0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1aeb0 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 6e 50 61 67  er->mxPgno>=nPag
1aec0 65 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  e );.  }.  retur
1aed0 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
1aee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
1aef0 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
1af00 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
1af10 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
1af20 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
1af30 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
1af40 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
1af50 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
1af60 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
1af70 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
1af80 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
1af90 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
1afa0 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
1afb0 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
1afc0 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
1afd0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
1afe0 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
1aff0 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
1b000 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
1b010 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
1b020 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
1b030 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
1b040 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
1b050 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
1b060 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
1b070 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
1b080 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
1b090 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
1b0a0 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
1b0b0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
1b0c0 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
1b0d0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
1b0e0 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
1b0f0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
1b100 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
1b110 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
1b120 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
1b130 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
1b140 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
1b150 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
1b160 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
1b170 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
1b180 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
1b190 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
1b1a0 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
1b1b0 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
1b1c0 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
1b1d0 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
1b1e0 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
1b1f0 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74   to. .**.** If t
1b200 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65  he pager was ope
1b210 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65  ned on a transie
1b220 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61  nt file (zFilena
1b230 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f  me==""), or.** o
1b240 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20  pened on a file 
1b250 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65  less than N byte
1b260 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f  s in size, the o
1b270 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a  utput buffer is.
1b280 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51  ** zeroed and SQ
1b290 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1b2a0 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20  . The rationale 
1b2b0 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
1b2c0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
1b2d0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
1b2e0 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ad database head
1b2f0 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74  ers, and a new t
1b300 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a  ransient or.** z
1b310 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61  ero sized databa
1b320 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20  se has a header 
1b330 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e  than consists en
1b340 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73  tirely of zeroes
1b350 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49  ..**.** If any I
1b360 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72  O error apart fr
1b370 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  om SQLITE_IOERR_
1b380 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e  SHORT_READ is en
1b390 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68  countered,.** th
1b3a0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1b3b0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1b3c0 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63  caller and the c
1b3d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
1b3e0 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  * output buffer 
1b3f0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e  undefined..*/.in
1b400 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
1b410 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
1b420 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1b430 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
1b440 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
1b450 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b460 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
1b470 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28  0, N);.  assert(
1b480 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1b490 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1b4a0 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66  empFile );..  if
1b4b0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1b4c0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  ager) ){.    int
1b4d0 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 0a 20 20   isInWal = 0;.  
1b4e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1b4f0 6c 52 65 61 64 28 70 50 61 67 65 72 2d 3e 70 57  lRead(pPager->pW
1b500 61 6c 2c 20 31 2c 20 26 69 73 49 6e 57 61 6c 2c  al, 1, &isInWal,
1b510 20 4e 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   N, pDest);.    
1b520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b530 4b 20 7c 7c 20 69 73 49 6e 57 61 6c 20 29 7b 0a  K || isInWal ){.
1b540 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b550 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1b560 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1b570 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
1b580 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
1b590 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1b5a0 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
1b5b0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1b5c0 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
1b5d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
1b5e0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1b5f0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1b600 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b620 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b630 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
1b640 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1b650 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
1b660 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
1b670 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67  ed .** with pPag
1b680 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  er. Normally, th
1b690 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  is is calculated
1b6a0 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69   as (<db file si
1b6b0 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29  ze>/<page-size>)
1b6c0 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  ..** However, if
1b6d0 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
1b6e0 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
1b6f0 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
1b700 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
1b710 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
1b720 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
1b730 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1b740 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20  ger is in error 
1b750 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
1b760 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1b770 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
1b780 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
1b790 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1b7a0 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c  ed and *pnPage l
1b7b0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f  eft unchanged. O
1b7c0 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c  r,.** if the fil
1b7d0 65 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20  e system has to 
1b7e0 62 65 20 71 75 65 72 69 65 64 20 66 6f 72 20 74  be queried for t
1b7f0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1b800 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71  ile and.** the q
1b810 75 65 72 79 20 61 74 74 65 6d 70 74 20 72 65 74  uery attempt ret
1b820 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72  urns an IO error
1b830 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
1b840 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
1b850 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ** and *pnPage i
1b860 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
1b870 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1b880 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  e, if everything
1b890 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1b8a0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
1b8b0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
1b8c0 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74  d *pnPage is set
1b8d0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1b8e0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1b8f0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
1b900 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1b910 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
1b920 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
1b930 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 20  ){.  Pgno nPage 
1b940 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1b950 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
1b960 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f  n via *pnPage */
1b970 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
1b980 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1b990 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
1b9a0 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20  . Store this in 
1b9b0 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20  nPage. */.  if( 
1b9c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
1b9d0 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  lid ){.    nPage
1b9e0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1b9f0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1ba00 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1ba10 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
1ba20 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46   returned by OsF
1ba30 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20  ileSize() */.   
1ba40 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
1ba50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1ba60 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72   size in bytes r
1ba70 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c  eturned by OsFil
1ba80 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20  eSize() */..    
1ba90 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
1baa0 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
1bab0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1bac0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
1bad0 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
1bae0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
1baf0 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  nPage);.    }.. 
1bb00 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
1bb10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1bb20 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1bb30 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1bb40 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
1bb50 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1bb60 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
1bb70 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
1bb80 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
1bb90 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1bba0 2d 3e 66 64 2c 20 26 6e 29 29 20 29 7b 0a 20 20  ->fd, &n)) ){.  
1bbb0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72          pager_er
1bbc0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1bbd0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1bbe0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1bbf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1bc00 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
1bc10 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
1bc20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31         nPage = 1
1bc30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1bc40 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28         nPage = (
1bc50 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72  Pgno)(n / pPager
1bc60 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1bc70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1bc80 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1bc90 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1bca0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1bcb0 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
1bcc0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1bcd0 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
1bce0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1bcf0 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b  dbSizeValid = 1;
1bd00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1bd10 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
1bd20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1bd30 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67  in the file is g
1bd40 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1bd50 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
1bd60 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
1bd70 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
1bd80 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
1bd90 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
1bda0 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
1bdb0 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
1bdc0 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
1bdd0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
1bde0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
1bdf0 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
1be00 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70   /* Set the outp
1be10 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  ut variable and 
1be20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1be30 20 2a 2f 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   */.  *pnPage = 
1be40 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
1be50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1be60 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
1be70 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1be80 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68  e locktype on th
1be90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1bea0 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72   If.** a similar
1beb0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
1bec0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
1bed0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1bee0 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72  is a no-op.** (r
1bef0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
1bf00 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e  OK immediately).
1bf10 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1bf20 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  , attempt to obt
1bf30 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ain the lock usi
1bf40 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  ng sqlite3OsLock
1bf50 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74  (). Invoke .** t
1bf60 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
1bf70 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
1bf80 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
1bf90 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20  ailable. Repeat 
1bfa0 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75  .** until the bu
1bfb0 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
1bfc0 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  rns false or unt
1bfd0 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  il the attempt t
1bfe0 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65  o .** obtain the
1bff0 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
1c000 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1c010 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1c020 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
1c030 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
1c040 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
1c050 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
1c060 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63   is obtained suc
1c070 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74  cessfully, set t
1c080 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a  he Pager.state .
1c090 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c  ** variable to l
1c0a0 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72  ocktype before r
1c0b0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
1c0c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
1c0d0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
1c0e0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
1c0f0 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
1c100 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c120 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1c130 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  /..  /* The OS l
1c140 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
1c150 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
1c160 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
1c170 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
1c180 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
1c190 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
1c1a0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
1c1b0 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
1c1c0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
1c1d0 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
1c1e0 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
1c1f0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
1c200 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
1c210 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
1c220 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
1c230 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74  t be unknown. It
1c240 0a 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 68  .  ** must not h
1c250 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
1c260 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  d at this point.
1c270 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c280 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c290 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
1c2a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
1c2b0 69 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id==0 );.  asser
1c2c0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1c2d0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
1c2e0 7c 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69  | pPager->dbModi
1c2f0 66 69 65 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  fied==0 );..  /*
1c300 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
1c310 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d   is either a no-
1c320 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20  op (because the 
1c330 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69  requested lock i
1c340 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  s .  ** already 
1c350 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  held, or one of 
1c360 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73  the transistions
1c370 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68   that the busy-h
1c380 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20  andler.  ** may 
1c390 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e  be invoked durin
1c3a0 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  g, according to 
1c3b0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
1c3c0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
1c3d0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
1c3e0 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
1c3f0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  rt( (pPager->sta
1c400 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20  te>=locktype).  
1c410 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
1c420 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
1c430 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
1c440 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  ==PAGER_SHARED).
1c450 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
1c460 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1c470 52 45 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b  RESERVED && lock
1c480 74 79 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c  type==PAGER_EXCL
1c490 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69  USIVE).  );..  i
1c4a0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1c4b0 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
1c4c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c4d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1c4e0 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
1c4f0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1c500 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
1c510 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
1c520 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
1c530 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
1c540 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
1c550 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
1c560 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
1c570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c580 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1c590 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b   = (u8)locktype;
1c5a0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1c5b0 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
1c5c0 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
1c5d0 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
1c5e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c5f0 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65  ** Function asse
1c600 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
1c610 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65  aint(pPager) che
1c620 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  cks that one of 
1c630 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
1c640 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c  g is true for al
1c650 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75  l dirty pages cu
1c660 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
1c670 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a  age-cache:.**.**
1c680 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e     a) The page n
1c690 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
1c6a0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1c6b0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
1c6c0 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20  **      current 
1c6d0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
1c6e0 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a  in pages, OR.**.
1c6f0 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70  **   b) if the p
1c700 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65  age content were
1c710 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73   written at this
1c720 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20   time, it would 
1c730 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e  not.**      be n
1c740 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
1c750 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
1c760 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65  ntent out to the
1c770 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
1c780 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69       (as determi
1c790 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  ned by function 
1c7a0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
1c7b0 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ())..**.** If th
1c7c0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65  e condition asse
1c7d0 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rted by this fun
1c7e0 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ction were not t
1c7f0 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rue, and the.** 
1c800 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20  dirty page were 
1c810 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20  to be discarded 
1c820 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76  from the cache v
1c830 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65  ia the pagerStre
1c840 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  ss().** routine,
1c850 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77   pagerStress() w
1c860 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
1c870 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1c880 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68  content to.** th
1c890 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c8a0 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   If a savepoint 
1c8b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65  transaction were
1c8c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
1c8d0 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65  er.** this happe
1c8e0 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ned, the correct
1c8f0 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64   behaviour would
1c900 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74   be to restore t
1c910 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
1c920 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
1c930 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  e. However, sinc
1c940 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69  e this content i
1c950 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
1c960 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64   either.** the d
1c970 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
1c980 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  the portion of t
1c990 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1c9a0 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d  nal and .** sub-
1c9b0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62  journal rolled b
1c9c0 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ack the content 
1c9d0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73  could not be res
1c9e0 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  tored and the.**
1c9f0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1ca00 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  would become cor
1ca10 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72  rupt. It is ther
1ca20 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20  efore fortunate 
1ca30 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69  that .** this ci
1ca40 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f  rcumstance canno
1ca50 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20  t arise..*/.#if 
1ca60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1ca70 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
1ca80 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
1ca90 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48  ConstraintCb(PgH
1caa0 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  dr *pPg){.  asse
1cab0 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
1cac0 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
1cad0 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71  assert( !subjReq
1cae0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c  uiresPage(pPg) |
1caf0 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67  | pPg->pgno<=pPg
1cb00 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ->pPager->dbSize
1cb10 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   );.}.static voi
1cb20 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
1cb30 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72  Constraint(Pager
1cb40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
1cb50 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
1cb60 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
1cb70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72  PCache, assertTr
1cb80 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
1cb90 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Cb);.}.#else.# d
1cba0 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e  efine assertTrun
1cbb0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
1cbc0 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f  Pager).#endif../
1cbd0 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
1cbe0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
1cbf0 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
1cc00 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
1cc10 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
1cc20 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
1cc30 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
1cc40 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
1cc50 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
1cc60 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
1cc70 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
1cc80 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
1cc90 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
1cca0 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
1ccb0 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
1ccc0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
1ccd0 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
1cce0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ccf0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
1cd00 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1cd10 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
1cd20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1cd30 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
1cd40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1cd50 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
1cd60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1cd70 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1cd80 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1cd90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1cda0 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74   nPage;.  assert
1cdb0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
1cdc0 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a  nt(pPager);.}...
1cdd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1cde0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
1cdf0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
1ce00 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1ce10 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79  llback. It.** sy
1ce20 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ncs the journal 
1ce30 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68  file to disk, th
1ce40 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e  en sets pPager->
1ce50 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68  journalHdr to th
1ce60 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65  e.** size of the
1ce70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f   journal file so
1ce80 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f   that the pager_
1ce90 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
1cea0 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74  ne knows.** that
1ceb0 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
1cec0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
1ced0 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  n synced..**.** 
1cee0 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  Syncing a hot-jo
1cef0 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65  urnal to disk be
1cf00 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
1cf10 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  to roll it back 
1cf20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74  ensures .** that
1cf30 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c   if a power-fail
1cf40 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ure occurs durin
1cf50 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20  g the rollback, 
1cf60 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
1cf70 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c  .** attempts rol
1cf80 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
1cf90 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20  system recovery 
1cfa0 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f  sees the same jo
1cfb0 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74  urnal.** content
1cfc0 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73   as this process
1cfd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
1cfe0 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c  thing goes as pl
1cff0 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  anned, SQLITE_OK
1d000 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1d010 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20  herwise, .** an 
1d020 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1d030 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d040 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
1d050 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1d060 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1d070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1d080 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1d090 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1d0a0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
1d0b0 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
1d0c0 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d  YNC_NORMAL);.  }
1d0d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d0e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1d0f0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1d100 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
1d110 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1d120 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
1d130 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d140 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
1d150 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
1d160 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
1d170 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
1d180 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
1d190 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
1d1a0 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
1d1b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1d1c0 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
1d1d0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1d1e0 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
1d1f0 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
1d200 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
1d210 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
1d220 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
1d230 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
1d240 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
1d250 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
1d260 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
1d270 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1d280 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
1d290 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
1d2a0 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
1d2b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
1d2c0 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
1d2d0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
1d2e0 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
1d2f0 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
1d300 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
1d310 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1d320 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
1d330 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
1d340 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
1d350 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
1d360 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
1d370 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1d380 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
1d390 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1d3a0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
1d3b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75  er *pPager){.  u
1d3c0 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29  8 *pTmp = (u8 *)
1d3d0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1d3e0 65 3b 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  e;..  disable_si
1d3f0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
1d400 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
1d410 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
1d420 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
1d430 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
1d440 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1d450 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
1d460 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
1d470 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65   sqlite3WalClose
1d480 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1d490 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20  Pager->fd, .    
1d4a0 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  (pPager->noSync 
1d4b0 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79  ? 0 : pPager->sy
1d4c0 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20  nc_flags), .    
1d4d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d4e0 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50  , pTmp.  );.  pP
1d4f0 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
1d500 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
1d510 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1d520 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1d530 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1d540 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
1d550 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
1d560 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
1d570 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
1d580 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
1d590 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
1d5a0 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
1d5b0 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
1d5c0 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
1d5d0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
1d5e0 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
1d5f0 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
1d600 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
1d610 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
1d620 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
1d630 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
1d640 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
1d650 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
1d660 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
1d670 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
1d680 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
1d690 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
1d6a0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
1d6b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d6c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1d6d0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  fd) ){.      pPa
1d6e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70  ger->errCode = p
1d6f0 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
1d700 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1d710 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
1d720 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
1d730 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
1d740 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1d750 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
1d760 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1d770 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
1d780 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
1d790 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1d7a0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
1d7b0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
1d7c0 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
1d7d0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1d7e0 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
1d7f0 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
1d800 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
1d810 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
1d820 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
1d830 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
1d840 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
1d850 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
1d860 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
1d870 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
1d880 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
1d890 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
1d8a0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
1d8b0 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
1d8c0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
1d8d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
1d8e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
1d8f0 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
1d900 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
1d910 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d920 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
1d930 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
1d940 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1d950 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
1d960 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
1d970 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
1d980 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
1d990 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
1d9a0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
1d9b0 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
1d9c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1d9d0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
1d9e0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
1d9f0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
1da00 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1da10 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
1da20 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
1da30 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
1da40 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
1da50 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
1da60 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
1da70 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
1da80 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
1da90 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1daa0 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
1dab0 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
1dac0 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
1dad0 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
1dae0 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
1daf0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
1db00 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1db10 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
1db20 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1db30 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
1db40 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1db50 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d  tion is a.** no-
1db60 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
1db70 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
1db80 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
1db90 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a  e journal-mode.*
1dba0 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65  * and the device
1dbb0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1dbc0 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65   of the the file
1dbd0 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
1dbe0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
1dbf0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1dc00 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
1dc10 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
1dc20 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
1dc30 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
1dc40 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
1dc50 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
1dc60 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
1dc70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
1dc80 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
1dc90 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
1dca0 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
1dcb0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
1dcc0 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
1dcd0 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
1dce0 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
1dcf0 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
1dd00 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
1dd10 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
1dd20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
1dd30 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
1dd40 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
1dd50 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
1dd60 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
1dd70 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1dd80 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
1dd90 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
1dda0 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
1ddb0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
1ddc0 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
1ddd0 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
1dde0 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
1ddf0 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
1de00 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
1de10 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
1de20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
1de30 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
1de40 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
1de50 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
1de60 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
1de70 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
1de80 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
1de90 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
1dea0 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1deb0 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
1dec0 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
1ded0 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
1dee0 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
1def0 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
1df00 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
1df10 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65  ** The Pager.nee
1df20 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65  dSync flag is ne
1df30 76 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74  ver be set for t
1df40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1df50 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f  or any.** file o
1df60 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73  perating in no-s
1df70 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e  ync mode (Pager.
1df80 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f  noSync set to no
1df90 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49  n-zero)..**.** I
1dfa0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
1dfb0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
1dfc0 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
1dfd0 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
1dfe0 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
1dff0 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
1e000 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
1e010 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
1e020 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
1e030 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1e040 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
1e050 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1e060 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1e070 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1e080 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
1e090 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e0a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
1e0b0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  edSync ){.    as
1e0c0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
1e0d0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1e0e0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1e0f0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1e100 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1e110 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1e120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e140 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1e150 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
1e160 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1e170 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1e180 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1e190 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e1a0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1e1b0 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
1e1c0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1e1d0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1e1e0 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
1e1f0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
1e200 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
1e210 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
1e220 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
1e230 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
1e240 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
1e250 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
1e260 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
1e270 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
1e280 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
1e290 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1e2a0 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
1e2b0 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
1e2c0 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
1e2d0 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1e2e0 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
1e2f0 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
1e300 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
1e310 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
1e320 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
1e330 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
1e340 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
1e350 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
1e360 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
1e370 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e  onnection's tran
1e380 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
1e390 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
1e3a0 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
1e3b0 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
1e3c0 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
1e3d0 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
1e3e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
1e3f0 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
1e400 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
1e410 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1e420 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
1e430 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
1e440 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1e450 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
1e460 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
1e470 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
1e480 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
1e490 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1e4a0 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
1e4b0 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
1e4c0 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
1e4d0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
1e4e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
1e4f0 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
1e500 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
1e510 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
1e520 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
1e530 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
1e540 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
1e550 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1e560 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1e570 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
1e580 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
1e590 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
1e5a0 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
1e5b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
1e5c0 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
1e5d0 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
1e5e0 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
1e5f0 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
1e600 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
1e610 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
1e620 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
1e630 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
1e640 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1e650 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
1e660 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
1e670 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
1e680 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
1e690 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
1e6a0 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
1e6b0 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
1e6c0 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
1e6d0 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
1e6e0 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
1e6f0 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
1e700 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
1e710 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
1e720 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
1e730 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
1e740 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
1e750 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1e760 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
1e770 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
1e780 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
1e790 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65   u8 zHeader[size
1e7a0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1e7b0 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d  )+4];..        m
1e7c0 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
1e7d0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
1e7e0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1e7f0 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ic));.        pu
1e800 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
1e810 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
1e820 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
1e830 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20  >nRec);..       
1e840 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
1e850 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
1e860 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1e870 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e880 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
1e890 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
1e8a0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
1e8b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1e8c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
1e8d0 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
1e8e0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
1e8f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
1e900 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
1e910 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
1e920 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e930 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1e940 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
1e950 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
1e960 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
1e970 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1e980 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1e990 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1e9a0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1e9b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1e9c0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1e9d0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1e9e0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
1e9f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ea00 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
1ea10 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
1ea20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
1ea30 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
1ea40 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
1ea50 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
1ea60 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
1ea70 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
1ea80 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
1ea90 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
1eaa0 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
1eab0 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
1eac0 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
1ead0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
1eae0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
1eaf0 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
1eb00 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
1eb10 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
1eb20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
1eb30 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
1eb40 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
1eb50 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
1eb60 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
1eb70 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
1eb80 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
1eb90 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
1eba0 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
1ebb0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
1ebc0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1ebd0 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
1ebe0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1ebf0 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
1ec00 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
1ec10 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
1ec20 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
1ec30 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1ec40 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1ec50 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
1ec60 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1ec70 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
1ec80 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
1ec90 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
1eca0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1ecb0 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
1ecc0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
1ecd0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
1ece0 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
1ecf0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1ed00 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1ed10 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
1ed20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1ed30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1ed40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ed50 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
1ed60 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
1ed70 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
1ed80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1ed90 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
1eda0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1edb0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
1edc0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
1edd0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
1ede0 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
1edf0 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
1ee00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1ee10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1ee20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ee30 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
1ee40 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1ee50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
1ee60 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1ee70 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1ee80 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1ee90 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1eea0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1eeb0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1eec0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
1eed0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1eee0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1eef0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1ef00 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
1ef10 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1ef20 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
1ef30 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
1ef40 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
1ef50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1ef60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ef70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ef80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1ef90 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
1efa0 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75  file was just su
1efb0 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
1efc0 64 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65  d. Set Pager.nee
1efd0 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f  dSync .    ** to
1efe0 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20   zero and clear 
1eff0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1f000 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20  YNC flag on all 
1f010 70 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20  pagess..    */. 
1f020 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1f030 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
1f040 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1f050 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ted = 1;.    pPa
1f060 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1f070 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
1f080 6c 4f 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65  lOff;.    sqlite
1f090 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
1f0a0 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
1f0b0 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  Cache);.  }..  r
1f0c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f0d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
1f0e0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
1f0f0 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
1f100 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
1f110 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
1f120 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
1f130 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
1f140 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
1f150 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
1f160 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
1f170 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
1f180 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1f190 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
1f1a0 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
1f1b0 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
1f1c0 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
1f1d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1f1e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
1f1f0 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
1f200 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
1f210 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
1f220 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
1f230 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1f240 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
1f250 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
1f260 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
1f270 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
1f280 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
1f290 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
1f2a0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
1f2b0 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
1f2c0 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
1f2d0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1f2e0 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
1f2f0 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1f300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f310 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
1f320 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
1f330 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
1f340 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1f350 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
1f360 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
1f370 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
1f380 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
1f390 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
1f3a0 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
1f3b0 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
1f3c0 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
1f3d0 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
1f3e0 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
1f3f0 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
1f400 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
1f410 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1f420 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
1f430 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
1f440 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
1f450 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
1f460 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
1f470 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
1f480 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
1f490 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
1f4a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
1f4b0 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
1f4c0 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
1f4d0 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
1f4e0 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
1f4f0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
1f500 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
1f510 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
1f520 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
1f530 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
1f540 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
1f550 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
1f560 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
1f570 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
1f580 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
1f590 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
1f5a0 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
1f5b0 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
1f5c0 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
1f5d0 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
1f5e0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
1f5f0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
1f600 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
1f610 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1f620 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
1f630 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
1f640 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1f650 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
1f660 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
1f670 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
1f680 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
1f690 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1f6a0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1f6b0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
1f6c0 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
1f6d0 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
1f6e0 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f700 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1f710 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1f740 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66  rn code */..  if
1f750 28 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30  ( NEVER(pList==0
1f760 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1f770 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
1f780 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
1f790 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
1f7a0 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
1f7b0 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
1f7c0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
1f7d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
1f7e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1f7f0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
1f800 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
1f810 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
1f820 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69  wing.  ** call i
1f830 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
1f840 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
1f850 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
1f860 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
1f870 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
1f880 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
1f890 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
1f8a0 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
1f8b0 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
1f8c0 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
1f8d0 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
1f8e0 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
1f8f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
1f900 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
1f910 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
1f920 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
1f930 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
1f940 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
1f950 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
1f960 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
1f970 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
1f980 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
1f990 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
1f9a0 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
1f9b0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
1f9c0 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
1f9d0 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
1f9e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
1f9f0 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
1fa00 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
1fa10 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
1fa20 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
1fa30 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
1fa40 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
1fa50 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
1fa60 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
1fa70 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
1fa80 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
1fa90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1faa0 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
1fab0 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
1fac0 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
1fad0 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
1fae0 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
1faf0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
1fb00 55 73 65 57 61 6c 28 70 4c 69 73 74 2d 3e 70 50  UseWal(pList->pP
1fb10 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
1fb20 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1fb30 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1fb40 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
1fb50 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
1fb60 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
1fb70 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  LOCK);..  /* If 
1fb80 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
1fb90 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
1fba0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
1fbb0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
1fbc0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
1fbd0 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
1fbe0 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
1fbf0 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
1fc00 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
1fc10 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
1fc20 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
1fc30 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
1fc40 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
1fc50 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
1fc60 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
1fc70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
1fc80 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
1fc90 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
1fca0 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
1fcb0 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
1fcc0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
1fcd0 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
1fce0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1fcf0 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
1fd00 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
1fd10 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
1fd20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1fd30 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
1fd40 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
1fd50 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
1fd60 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
1fd70 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
1fd80 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
1fd90 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1fda0 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
1fdb0 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
1fdc0 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
1fdd0 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
1fde0 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
1fdf0 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
1fe00 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
1fe10 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
1fe20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1fe30 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
1fe40 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
1fe50 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
1fe60 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
1fe70 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
1fe80 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
1fe90 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1fea0 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
1feb0 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
1fec0 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
1fed0 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
1fee0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1fef0 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
1ff00 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
1ff10 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
1ff20 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66  geSize;   /* Off
1ff30 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  set to write */.
1ff40 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
1ff50 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff70 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20       /* Data to 
1ff80 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20  write */    ..  
1ff90 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
1ffa0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
1ffb0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
1ffc0 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
1ffd0 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
1ffe0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
1fff0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
20000 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70   Write out the p
20010 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  age data. */.   
20020 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20030 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
20040 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
20050 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
20060 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  et);..      /* I
20070 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
20080 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
20090 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
200a0 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
200b0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
200c0 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
200d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
200e0 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
200f0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
20100 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
20110 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
20120 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
20130 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
20140 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
20150 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
20160 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
20170 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
20180 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
20190 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
201a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
201b0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
201c0 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
201d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
201e0 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
201f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
20200 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63  * Update any bac
20210 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79  kup objects copy
20220 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
20230 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20   of this pager. 
20240 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
20250 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
20260 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
20270 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e  no, (u8*)pList->
20280 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50  pData);..      P
20290 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
202a0 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
202b0 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
202d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
202e0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
202f0 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
20300 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
20310 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
20320 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
20330 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
20340 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
20350 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
20360 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
20370 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
20380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20390 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
203a0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
203b0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
203c0 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
203d0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
203e0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
203f0 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
20400 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
20410 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
20420 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
20430 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
20440 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
20450 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
20460 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
20470 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
20480 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
20490 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
204a0 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
204b0 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
204c0 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
204d0 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
204e0 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
204f0 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
20500 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
20510 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
20520 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
20530 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
20540 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
20550 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
20560 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
20570 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
20580 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
20590 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
205a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
205b0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
205c0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
205d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
205e0 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
205f0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
20600 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
20610 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
20620 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
20630 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
20640 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
20650 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
20660 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
20670 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
20680 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
20690 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
206a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
206b0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
206c0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
206d0 61 67 65 72 3b 0a 20 20 69 66 28 20 69 73 4f 70  ager;.  if( isOp
206e0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
206f0 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
20700 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
20710 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
20720 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52   = pPager->nSubR
20730 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
20740 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 63 68 61  geSize);.    cha
20750 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20  r *pData2;..    
20760 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
20770 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
20780 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
20790 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
207a0 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  ;.    PAGERTRACE
207b0 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
207c0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
207d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
207e0 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 0a  pPg->pgno));.  .
207f0 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
20800 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20810 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
20820 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
20830 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67  .         || pPg
20840 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
20850 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29  bOrigSize .    )
20860 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  ;.    rc = write
20870 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
20880 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
20890 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
208a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
208b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
208c0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
208d0 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32  er->sjfd, pData2
208e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
208f0 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
20900 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
20910 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20920 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
20930 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
20940 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
20950 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
20960 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
20970 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
20980 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
20990 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
209a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
209b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
209c0 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
209d0 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20  yer when it has 
209e0 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20  reached some.** 
209f0 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69  soft memory limi
20a00 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
20a10 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
20a20 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62  er to a Pager ob
20a30 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73  ject.** (cast as
20a40 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70   a void*). The p
20a50 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27  ager is always '
20a60 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20  purgeable' (not 
20a70 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
20a80 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73  database). The s
20a90 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
20aa0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
20ab0 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20   a page that is 
20ac0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69  .** currently di
20ad0 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f  rty but has no o
20ae0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
20af0 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a  ences. The page.
20b00 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  ** is always ass
20b10 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
20b20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
20b30 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
20b40 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  t .** argument..
20b50 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
20b60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
20b70 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c  s to make pPg cl
20b80 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69  ean by writing i
20b90 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  ts contents.** o
20ba0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
20bb0 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73  se file, if poss
20bc0 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69  ible. This may i
20bd0 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74  nvolve syncing t
20be0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
20bf0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  le. .**.** If su
20c00 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65  ccessful, sqlite
20c10 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
20c20 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
20c30 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  the page and.** 
20c40 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
20c50 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
20c60 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
20c70 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74  trying to make t
20c80 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e  he.** page clean
20c90 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
20ca0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
20cb0 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e   If the page can
20cc0 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63  not be.** made c
20cd0 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74  lean for some ot
20ce0 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20  her reason, but 
20cf0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
20d00 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a   then SQLITE_OK.
20d10 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  ** is returned b
20d20 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  y sqlite3PcacheM
20d30 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f  akeClean() is no
20d40 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  t called..*/.sta
20d50 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
20d60 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
20d70 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
20d80 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
20d90 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
20da0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
20db0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
20dc0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
20dd0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
20de0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
20df0 20 29 3b 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72   );..  pPg->pDir
20e00 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61  ty = 0;.  if( pa
20e10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
20e20 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74  ) ){.    /* Writ
20e30 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65  e a single frame
20e40 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74   for this page t
20e50 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20  o the log. */.  
20e60 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
20e70 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a  esPage(pPg) ){ .
20e80 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
20e90 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20  urnalPage(pPg); 
20ea0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
20eb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20ec0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20ed0 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
20ee0 2c 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b  , pPg, 0, 0, 0);
20ef0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
20f00 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74      /* The doNot
20f10 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
20f20 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 50   by the sqlite3P
20f30 61 67 65 72 57 72 69 74 65 28 29 20 66 75 6e 63  agerWrite() func
20f40 74 69 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20 20  tion while it.  
20f50 20 20 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c    ** is journall
20f60 69 6e 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f  ing a set of two
20f70 20 6f 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73   or more databas
20f80 65 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  e pages that are
20f90 20 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 6f   stored.    ** o
20fa0 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b 20  n the same disk 
20fb0 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20  sector. Syncing 
20fc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
20fd0 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65  ot allowed while
20fe0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
20ff0 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20  happening as it 
21000 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
21010 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  t all members of
21020 20 73 75 63 68 20 61 0a 20 20 20 20 2a 2a 20 73   such a.    ** s
21030 65 74 20 6f 66 20 70 61 67 65 73 20 61 72 65 20  et of pages are 
21040 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74  synced to disk t
21050 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20  ogether. So, if 
21060 74 68 65 20 70 61 67 65 20 74 68 69 73 20 66 75  the page this fu
21070 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73  nction.    ** is
21080 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
21090 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69  clean will requi
210a0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  re a journal syn
210b0 63 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53  c and the doNotS
210c0 79 6e 63 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ync.    ** flag 
210d0 69 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77  is set, return w
210e0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
210f0 74 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68  thing. The pcach
21100 65 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 20  e layer will.   
21110 20 2a 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f   ** just have to
21120 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c   go ahead and al
21130 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
21140 65 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64  e buffer instead
21150 20 6f 66 0a 20 20 20 20 2a 2a 20 72 65 75 73 69   of.    ** reusi
21160 6e 67 20 70 50 67 2e 0a 20 20 20 20 2a 2a 0a 20  ng pPg..    **. 
21170 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
21180 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61   if the pager ha
21190 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
211a0 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
211b0 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  e, do not.    **
211c0 20 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68   try to write th
211d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
211e0 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a  g to disk..    *
211f0 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  /.    if( NEVER(
21200 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
21210 0a 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72  .     || (pPager
21220 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70  ->doNotSync && p
21230 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
21240 4e 45 45 44 5f 53 59 4e 43 29 0a 20 20 20 20 29  NEED_SYNC).    )
21250 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
21260 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
21270 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
21280 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
21290 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
212a0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
212b0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
212c0 4e 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NC ){.      rc =
212d0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
212e0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
212f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21300 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
21310 63 20 26 26 20 0a 20 20 20 20 20 20 20 20 21 28  c && .        !(
21320 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
21330 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
21340 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26  ALMODE_MEMORY) &
21350 26 0a 20 20 20 20 20 20 20 20 21 28 73 71 6c 69  &.        !(sqli
21360 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
21370 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
21380 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  r->fd)&SQLITE_IO
21390 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
213a0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
213b0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
213c0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
213d0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
213e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
213f0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
21400 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
21410 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67  mber of this pag
21420 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
21430 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
21440 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
21450 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
21460 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  it may need to b
21470 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
21480 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   sub-journal..  
21490 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
214a0 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
214b0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
214c0 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69  elist() below wi
214d0 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63  ll not.    ** ac
214e0 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74  tually write dat
214f0 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e  a to the file in
21500 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
21510 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64  **.    ** Consid
21520 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
21530 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65   sequence of eve
21540 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nts:.    **.    
21550 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  **   BEGIN;.    
21560 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
21570 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
21580 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20     <modify page 
21590 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41  X>.    **     SA
215a0 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20  VEPOINT sp;.    
215b0 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b  **       <shrink
215c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
215d0 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a  o Y pages>.    *
215e0 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72  *       pagerStr
215f0 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20  ess(page X).    
21600 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
21610 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20  TO sp;.    **.  
21620 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74    ** If (X>Y), t
21630 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74  hen when pagerSt
21640 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70  ress is called p
21650 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62  age X will not b
21660 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  e written.    **
21670 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
21680 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77  base file, but w
21690 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66  ill be dropped f
216a0 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54  rom the cache. T
216b0 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c  hen,.    ** foll
216c0 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42  owing the "ROLLB
216d0 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65  ACK TO sp" state
216e0 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61  ment, reading pa
216f0 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20  ge X will read. 
21700 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20     ** data from 
21710 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21720 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  e. This will be 
21730 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65  the copy of page
21740 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20   X as it.    ** 
21750 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61  was when the tra
21760 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
21770 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20  , not as it was 
21780 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20  when "SAVEPOINT 
21790 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65  sp".    ** was e
217a0 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  xecuted..    **.
217b0 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74      ** The solut
217c0 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
217d0 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
217e0 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
217f0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62   the .    ** sub
21800 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f  -journal file no
21810 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  w (if it is not 
21820 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20  already there), 
21830 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a  so that it will.
21840 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72      ** be restor
21850 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e  ed to its curren
21860 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65  t value when the
21870 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
21880 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65  " is .    ** exe
21890 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cuted..    */.  
218a0 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20    if( NEVER(.   
218b0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
218c0 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e  OK && pPg->pgno>
218d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
218e0 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
218f0 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b  ge(pPg).    ) ){
21900 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
21910 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
21920 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
21930 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
21940 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
21950 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
21960 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
21970 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21980 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
21990 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
219a0 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
219b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  }.  }..  /* Mark
219c0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
219d0 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
219e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
219f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
21a00 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
21a10 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
21a20 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
21a30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
21a40 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
21a50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
21a60 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
21a70 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f  ager, rc);.}.../
21a80 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
21a90 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  d initialize a n
21aa0 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ew Pager object 
21ab0 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
21ac0 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70  r to it.** in *p
21ad0 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65  pPager. The page
21ae0 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  r should eventua
21af0 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20  lly be freed by 
21b00 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f  passing it.** to
21b10 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
21b20 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  se()..**.** The 
21b30 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
21b40 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74  nt is the path t
21b50 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
21b60 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20  ile to open..** 
21b70 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
21b80 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
21b90 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
21ba0 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
21bb0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
21bc0 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
21bd0 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f  be cached. Tempo
21be0 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62  rary files are b
21bf0 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
21c00 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
21c10 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e  they are closed.
21c20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
21c30 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
21c40 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61   .** all informa
21c50 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
21c60 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76  cache. It is nev
21c70 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
21c80 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e  sk. .** This can
21c90 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
21ca0 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ement an in-memo
21cb0 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
21cc0 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61  ** The nExtra pa
21cd0 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
21ce0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
21cf0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
21d00 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
21d10 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65  g with each page
21d20 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
21d30 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
21d40 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a  ble to the user.
21d50 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
21d60 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
21d70 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ) API..**.** The
21d80 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
21d90 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  is used to speci
21da0 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68  fy properties th
21db0 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a  at affect the.**
21dc0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
21dd0 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75  e pager. It shou
21de0 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d  ld be passed som
21df0 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e  e bitwise combin
21e00 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ation.** of the 
21e10 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
21e20 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f  AL and PAGER_NO_
21e30 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a  READLOCK flags..
21e40 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61  **.** The vfsFla
21e50 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  gs parameter is 
21e60 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73  a bitmask to pas
21e70 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70  s to the flags p
21e80 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
21e90 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f  he xOpen() metho
21ea0 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  d of the supplie
21eb0 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69  d VFS when openi
21ec0 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a  ng files. .**.**
21ed0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   If the pager ob
21ee0 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
21ef0 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  d and the specif
21f00 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  ied file opened 
21f10 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
21f20 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
21f30 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
21f40 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e  ager set to poin
21f50 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
21f60 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
21f70 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21f80 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65  , *ppPager is se
21f90 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64  t to NULL.** and
21fa0 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   error code retu
21fb0 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  rned. This funct
21fc0 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
21fd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28  QLITE_NOMEM.** (
21fe0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20  sqlite3Malloc() 
21ff0 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
22000 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c  ate memory), SQL
22010 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20  ITE_CANTOPEN or 
22020 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49  .** various SQLI
22030 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73  TE_IO_XXX errors
22040 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22050 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c  PagerOpen(.  sql
22060 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
22070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
22080 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  tual file system
22090 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67   to use */.  Pag
220a0 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
220b0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
220c0 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
220d0 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
220e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
220f0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
22100 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
22110 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
22120 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
22130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22140 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
22150 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
22160 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
22170 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
22180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
22190 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
221a0 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
221b0 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20  t vfsFlags,     
221c0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
221d0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
221e0 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
221f0 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20  pen() */.  void 
22200 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
22210 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  e*) /* Function 
22220 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20  to reinitialize 
22230 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  pages */.){.  u8
22240 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
22250 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20  *pPager = 0;    
22260 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
22270 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ct to allocate a
22280 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  nd return */.  i
22290 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
222a0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
222b0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
222c0 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20  tempFile = 0;   
222d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
222e0 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63   temp files (inc
222f0 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  l. in-memory fil
22300 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d  es) */.  int mem
22310 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Db = 0;         
22320 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
22330 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
22340 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
22350 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  readOnly = 0;   
22360 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22370 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f  this is a read-o
22380 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nly file */.  in
22390 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
223a0 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  e;     /* Bytes 
223b0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
223c0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20  each journal fd 
223d0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
223e0 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  name = 0;     /*
223f0 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61   Full path to da
22400 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
22410 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
22420 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
22430 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
22440 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69  zPathname */.  i
22450 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
22460 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
22470 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
22480 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69   /* False to omi
22490 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
224a0 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
224b0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
224c0 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20  O_READLOCK)!=0; 
224d0 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
224e0 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
224f0 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
22500 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
22510 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
22520 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
22530 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
22540 20 75 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20   u16 szPageDflt 
22550 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
22560 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
22570 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
22580 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  e */..  /* Figur
22590 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73  e out how much s
225a0 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64  pace is required
225b0 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
225c0 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20  l file-handle.  
225d0 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77  ** (there are tw
225e0 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d  o of them, the m
225f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
22600 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29  the sub-journal)
22610 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74  . This.  ** is t
22620 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65  he maximum space
22630 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
22640 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
22650 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a  al file handle .
22660 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c    ** and a regul
22670 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ar journal file-
22680 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61  handle. Note tha
22690 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75  t a "regular jou
226a0 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a  rnal-handle".  *
226b0 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70  * may be a wrapp
226c0 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61  er capable of ca
226d0 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ching the first 
226e0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  portion of the j
226f0 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
22700 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d   in memory to im
22710 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d  plement the atom
22720 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
22730 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a  ation (see .  **
22740 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75   source file jou
22750 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20  rnal.c)..  */.  
22760 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
22770 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c  alSize(pVfs)>sql
22780 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
22790 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72  ze() ){.    jour
227a0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
227b0 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72  UND8(sqlite3Jour
227c0 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a  nalSize(pVfs));.
227d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75    }else{.    jou
227e0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
227f0 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d  OUND8(sqlite3Mem
22800 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a  JournalSize());.
22810 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
22820 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
22830 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
22840 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
22850 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
22860 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70   = 0;..  /* Comp
22870 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ute and store th
22880 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
22890 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  in an allocated 
228a0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20  buffer pointed. 
228b0 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e   ** to by zPathn
228c0 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74  ame, length nPat
228d0 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68  hname. Or, if th
228e0 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
228f0 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61  y file,.  ** lea
22900 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d  ve both nPathnam
22910 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20  e and zPathname 
22920 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20  set to 0..  */. 
22930 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
22940 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
22950 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  {.    nPathname 
22960 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
22970 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
22980 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
22990 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
229a0 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
229b0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
229c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
229d0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  MEM;.    }.#ifnd
229e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
229f0 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
22a00 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
22a10 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
22a20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
22a30 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
22a40 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
22a50 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
22a60 20 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61   {.      zPathna
22a70 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
22a80 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
22a90 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
22aa0 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
22ab0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
22ac0 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
22ad0 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
22ae0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
22af0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
22b00 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   }..    nPathnam
22b10 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
22b20 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
22b30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22b40 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
22b50 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
22b60 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
22b70 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
22b80 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
22b90 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
22ba0 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
22bb0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
22bc0 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
22bd0 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
22be0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
22bf0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
22c00 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
22c10 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
22c20 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
22c30 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
22c40 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
22c50 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
22c60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
22c70 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
22c80 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
22c90 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
22ca0 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
22cb0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
22cc0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
22cd0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
22ce0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22cf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22d00 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
22d10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
22d20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
22d30 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
22d40 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
22d50 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
22d60 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
22d70 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
22d80 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
22d90 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
22da0 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
22db0 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
22dc0 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
22dd0 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
22de0 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
22df0 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
22e00 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
22e10 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
22e20 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
22e30 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
22e40 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
22e50 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
22e60 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
22e70 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
22e80 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
22e90 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
22ea0 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
22eb0 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
22ec0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
22ed0 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
22ee0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
22ef0 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
22f00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
22f10 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
22f20 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
22f30 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
22f40 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
22f50 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
22f60 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
22f70 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
22f80 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
22f90 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
22fa0 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
22fb0 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
22fc0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
22fd0 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
22fe0 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
22ff0 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
23000 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
23010 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
23020 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
23030 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
23040 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
23050 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
23060 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
23070 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
23080 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
23090 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
230a0 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
230b0 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
230c0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
230d0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
230e0 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
230f0 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
23100 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20  + 8 + 1         
23110 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
23120 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72   */.  );.  asser
23130 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
23140 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
23150 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
23160 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
23170 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
23180 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23190 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
231a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
231b0 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
231c0 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
231d0 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
231e0 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
231f0 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
23200 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
23210 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
23220 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
23230 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
23240 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
23250 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
23260 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
23270 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
23280 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
23290 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
232a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
232b0 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
232c0 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
232d0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
232e0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
232f0 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
23300 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
23310 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
23320 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
23330 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
23340 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
23350 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
23360 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
23370 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
23380 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
23390 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
233a0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61  hname ){.    pPa
233b0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
233c0 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
233d0 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29  = nPathname + 1)
233e0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
233f0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
23400 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
23410 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
23420 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
23430 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
23440 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
23450 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
23460 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
23470 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  e], "-journal", 
23480 38 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  8);.    if( pPag
23490 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  er->zFilename[0]
234a0 3d 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a  ==0 ) pPager->zJ
234b0 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20  ournal[0] = 0;. 
234c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
234d0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
234e0 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
234f0 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
23500 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
23510 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
23520 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
23530 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
23540 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
23550 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20  me[0] && !memDb 
23560 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
23570 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
23580 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
23590 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
235a0 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
235b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
235c0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
235d0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
235e0 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
235f0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65  , &fout);.    re
23600 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
23610 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
23620 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
23630 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
23640 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
23650 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
23660 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
23670 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
23680 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
23690 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
236a0 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
236b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
236c0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
236d0 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
236e0 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
236f0 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
23700 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
23710 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
23720 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
23730 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
23740 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
23750 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
23760 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
23770 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
23780 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
23790 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
237a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
237b0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
237c0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
237d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
237e0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
237f0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
23800 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
23810 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
23820 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
23830 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
23840 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
23850 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
23860 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
23870 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
23880 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
23890 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
238a0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
238b0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
238c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
238d0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
238e0 74 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d  t = (u16)pPager-
238f0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
23900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
23910 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
23920 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
23930 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
23940 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
23950 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
23960 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
23970 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
23980 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61  nt ii;.        a
23990 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
239a0 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
239b0 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
239c0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
239d0 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
239e0 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
239f0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
23a00 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
23a10 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
23a20 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
23a30 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
23a40 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
23a50 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
23a60 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
23a70 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
23a80 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
23a90 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
23aa0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
23ab0 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
23ac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23ad0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
23ae0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
23af0 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
23b00 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
23b10 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
23b20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
23b30 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
23b40 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
23b50 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
23b60 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
23b70 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
23b80 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
23b90 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
23ba0 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
23bb0 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
23bc0 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
23bd0 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
23be0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
23bf0 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
23c00 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
23c10 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
23c20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
23c30 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
23c40 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
23c50 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
23c60 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
23c70 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
23c80 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
23c90 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
23ca0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
23cb0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
23cc0 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
23cd0 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
23ce0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
23cf0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
23d00 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
23d10 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
23d20 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
23d30 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
23d40 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
23d50 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
23d60 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
23d70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
23d80 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
23d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
23da0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
23db0 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
23dc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
23dd0 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
23de0 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
23df0 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
23e00 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
23e10 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
23e20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
23e30 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
23e40 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
23e50 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a  , free the .  **
23e60 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
23e70 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
23e80 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
23e90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23ea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
23eb0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
23ec0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
23ed0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
23ee0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
23ef0 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
23f00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
23f10 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
23f20 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
23f30 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ct. */.  assert(
23f40 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
23f50 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
23f60 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c  8(nExtra);.  sql
23f70 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
23f80 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
23f90 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
23fb0 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
23fc0 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
23fd0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
23fe0 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54  ache);..  PAGERT
23ff0 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
24000 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
24010 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
24020 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
24030 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
24040 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
24050 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
24060 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
24070 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
24080 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
24090 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  al;.  pPager->no
240a0 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65  Readlock = (noRe
240b0 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
240c0 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70  ly) ?1:0;.  /* p
240d0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
240e0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
240f0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
24100 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
24110 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
24120 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
24130 65 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d  eValid = (u8)mem
24140 44 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  Db;.  /* pPager-
24150 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
24160 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
24170 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
24180 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
24190 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
241a0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
241b0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
241c0 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
241d0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
241e0 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73  _UNLOCK; */.  as
241f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
24200 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
24210 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
24220 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
24230 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  K) );.  /* pPage
24240 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
24250 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
24260 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
24270 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
24280 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
24290 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
242a0 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
242b0 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
242c0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
242d0 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
242e0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
242f0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
24300 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
24310 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
24320 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
24330 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
24340 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
24350 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
24360 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
24370 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
24380 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
24390 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  u8)readOnly;.  /
243a0 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
243b0 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73  nc = 0; */.  ass
243c0 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
243d0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
243e0 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
243f0 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
24400 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
24410 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
24420 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
24430 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?0:1;.  pPager->
24440 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c  sync_flags = SQL
24450 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
24460 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
24470 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
24480 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
24490 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
244a0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
244b0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
244c0 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31  er->nExtra = (u1
244d0 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  6)nExtra;.  pPag
244e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
244f0 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
24500 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
24510 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
24520 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
24530 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
24540 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
24550 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
24560 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c   if( !useJournal
24570 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24580 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
24590 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
245a0 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  OFF;.  }else if(
245b0 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
245c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
245d0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
245e0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
245f0 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
24600 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
24610 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
24620 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
24630 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
24640 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
24650 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d  Reinit;.  /* mem
24660 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
24670 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
24680 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
24690 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ..  *ppPager = p
246a0 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
246b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
246c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
246d0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
246e0 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
246f0 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
24700 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
24710 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
24720 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
24730 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
24740 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
24750 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
24760 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
24770 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
24780 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
24790 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
247a0 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
247b0 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
247c0 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
247d0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
247e0 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
247f0 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72  wing criteria ar
24800 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  e met:.**.**   *
24810 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
24820 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
24830 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64  file system, and
24840 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65  .**   * No proce
24850 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
24860 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
24870 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
24880 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  ase file, and.**
24890 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
248a0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73  e file itself is
248b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
248c0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61  bytes in size, a
248d0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69  nd.**   * The fi
248e0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
248f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
24900 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30  sts and is not 0
24910 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  x00..**.** If th
24920 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
24930 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
24940 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
24950 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
24960 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
24970 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
24980 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
24990 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
249a0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
249b0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
249c0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
249d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
249e0 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
249f0 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
24a00 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
24a10 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
24a20 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
24a30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
24a40 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  tine does not ch
24a50 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
24a60 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
24a70 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20   filename.** at 
24a80 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
24a90 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
24aa0 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65  , and that maste
24ab0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  r journal file.*
24ac0 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
24ad0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
24ae0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
24af0 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68  eally hot. In th
24b00 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20  is.** case this 
24b10 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
24b20 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69  urn a false-posi
24b30 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f  tive. The pager_
24b40 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f  playback().** ro
24b50 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
24b60 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ver that the jou
24b70 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
24b80 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
24b90 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
24ba0 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a  l it back. .**.*
24bb0 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * If a hot-journ
24bc0 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  al file is found
24bd0 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69   to exist, *pExi
24be0 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20  sts is set to 1 
24bf0 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  and .** SQLITE_O
24c00 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  K returned. If n
24c10 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  o hot-journal fi
24c20 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a  le is present, *
24c30 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65  pExists is.** se
24c40 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
24c50 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
24c60 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
24c70 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
24c80 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  g.** to determin
24c90 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
24ca0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
24cb0 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ile exists, the 
24cc0 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  IO error.** code
24cd0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
24ce0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
24cf0 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69  Exists is undefi
24d00 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
24d10 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
24d20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24d30 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
24d40 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
24d50 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
24d60 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
24d70 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
24d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
24d90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
24da0 74 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20  t exists;       
24db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24dc0 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  rue if a journal
24dd0 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
24de0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
24df0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
24e00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
24e10 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
24e20 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
24e30 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
24e40 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
24e50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
24e60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24e70 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53  state <= PAGER_S
24e80 48 41 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78  HARED );..  *pEx
24e90 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  ists = 0;.  rc =
24ea0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
24eb0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
24ec0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
24ed0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
24ee0 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72  exists);.  if( r
24ef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24f00 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
24f10 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
24f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
24f30 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
24f40 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
24f50 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
24f60 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
24f70 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
24f80 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
24f90 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
24fa0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
24fb0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
24fc0 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
24fd0 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
24fe0 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
24ff0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
25000 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
25010 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
25020 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
25030 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
25040 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
25050 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
25060 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
25070 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
25080 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
25090 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
250a0 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
250b0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
250c0 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
250d0 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
250e0 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
250f0 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
25100 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
25110 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
25120 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
25130 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
25140 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
25150 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
25160 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
25170 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
25180 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
25190 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
251a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
251b0 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69  ocked ){.      i
251c0 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20  nt nPage;..     
251d0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
251e0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
251f0 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
25200 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
25210 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
25220 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
25230 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
25240 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
25250 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
25260 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
25270 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
25280 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
25290 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
252a0 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
252b0 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
252c0 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
252d0 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
252e0 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
252f0 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
25300 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
25310 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
25320 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
25330 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
25340 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25350 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
25360 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
25370 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
25380 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
25390 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
253a0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
253b0 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
253c0 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
253d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
253e0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
253f0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
25400 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
25410 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
25420 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
25430 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
25440 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
25450 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25460 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
25470 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
25480 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
25490 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
254a0 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
254b0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
254c0 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
254d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
254e0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
254f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25500 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
25510 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
25520 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
25530 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
25540 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
25550 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
25560 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
25570 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
25580 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
25590 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
255a0 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
255b0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
255c0 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
255d0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
255e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
255f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
25600 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
25610 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
25620 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
25630 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
25640 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
25650 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
25660 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
25670 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25690 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
256a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
256b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
256c0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
256d0 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
256e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
256f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25700 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
25710 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
25720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
25730 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
25740 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
25750 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
25760 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
25770 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
25780 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
25790 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
257a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
257b0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
257c0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
257d0 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
257e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
257f0 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
25800 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
25810 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a    ** its has a z
25820 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
25830 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
25840 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
25850 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
25860 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
25870 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
25880 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
25890 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
258a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
258b0 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
258c0 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
258d0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
258e0 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
258f0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
25900 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
25910 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
25920 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
25930 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
25940 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
25950 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
25960 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
25970 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
25980 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
25990 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
259a0 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
259b0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
259c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
259d0 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
259e0 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
259f0 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
25a00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
25a10 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
25a20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
25a30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
25a40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
25a50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
25a60 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
25a70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25a80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
25a90 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
25aa0 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
25ab0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
25ac0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
25ad0 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
25ae0 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74  gerAcquire() unt
25af0 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
25b00 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
25b10 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
25b20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
25b30 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
25b40 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
25b50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25b60 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
25b70 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
25b80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
25b90 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
25ba0 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
25bb0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
25bc0 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
25bd0 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
25be0 79 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  y in PAGER_UNLOC
25bf0 4b 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  K state (no lock
25c00 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
25c10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25c20 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
25c30 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
25c40 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
25c50 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
25c60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25c70 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
25c80 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
25c90 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
25ca0 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
25cb0 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
25cc0 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
25cd0 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
25ce0 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
25cf0 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
25d00 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
25d10 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
25d20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
25d30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
25d40 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
25d50 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
25d60 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
25d70 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
25d80 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
25d90 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
25da0 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
25db0 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
25dc0 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
25dd0 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
25de0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
25df0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
25e00 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
25e10 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
25e20 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
25e30 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
25e40 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
25e50 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
25e60 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
25e70 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
25e80 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
25e90 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
25ea0 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
25eb0 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
25ec0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
25ed0 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
25ee0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
25ef0 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
25f00 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
25f10 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  ** If the operat
25f20 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
25f30 20 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f   (2) above is no
25f40 74 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64  t attempted, and
25f50 20 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72   if the.** pager
25f60 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20   is in an error 
25f70 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e  state other than
25f80 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65   SQLITE_FULL whe
25f90 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
25fa0 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73  ,.** the error s
25fb0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
25fc0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20  is returned. It 
25fd0 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20  is permitted to 
25fe0 72 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61  read the.** data
25ff0 62 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c  base when in SQL
26000 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73  ITE_FULL error s
26010 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  tate..**.** Othe
26020 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74  rwise, if everyt
26030 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
26040 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
26050 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
26060 0a 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63  .** IO error occ
26070 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
26080 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
26090 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
260a0 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
260b0 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  le or rolling ba
260c0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
260d0 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
260e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
260f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26100 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
26110 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26120 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26130 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
26140 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
26150 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ode */.  int isE
26160 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20  rrorReset = 0;  
26170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26180 72 75 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e  rue if recoverin
26190 67 20 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61  g from error sta
261a0 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  te */..  /* This
261b0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
261c0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74   called from b-t
261d0 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65  ree and only whe
261e0 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  n there are no. 
261f0 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   ** outstanding 
26200 70 61 67 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  pages */.  asser
26210 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
26220 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
26230 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
26240 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44    if( NEVER(MEMD
26250 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  B && pPager->err
26260 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20  Code) ){ return 
26270 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
26280 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
26290 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
262a0 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20  an error-state, 
262b0 6e 6f 77 20 69 73 20 61 20 63 68 61 6e 63 65 20  now is a chance 
262c0 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68  to clear.  ** th
262d0 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64  e error. Discard
262e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
262f0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
26300 20 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   and rollback.  
26310 2a 2a 20 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e  ** any hot journ
26320 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  al in the file-s
26330 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  ystem..  */.  if
26340 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
26350 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f  e ){.    if( isO
26360 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
26370 20 7c 7c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75   || pPager->zJou
26380 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 73  rnal ){.      is
26390 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a  ErrorReset = 1;.
263a0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
263b0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
263c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72  TE_OK;.    pager
263d0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
263e0 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
263f0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
26400 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
26410 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 70 50 61  OpenSnapshot(pPa
26420 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ger);.  }else if
26430 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
26440 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
26450 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b   isErrorReset ){
26460 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
26470 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
26480 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
26490 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e    int isHotJourn
264a0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  al = 0;.    asse
264b0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
264c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
264d0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
264e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
264f0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
26500 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
26510 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  k ){.      asser
26520 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  t( pPager->readO
26530 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20 70 50 61  nly );.      pPa
26540 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
26550 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
26560 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
26570 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
26580 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
26590 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
265a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
265b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
265c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
265d0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
265e0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
265f0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
26600 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
26610 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
26620 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
26630 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
26640 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
26650 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
26660 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
26670 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
26680 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
26690 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
266a0 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
266b0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
266c0 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
266d0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
266e0 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74  f( !isErrorReset
266f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
26700 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
26710 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  <= PAGER_SHARED 
26720 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  );.      rc = ha
26730 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
26740 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61  er, &isHotJourna
26750 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
26760 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26770 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
26780 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
26790 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72 72 6f  }.    if( isErro
267a0 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a  rReset || isHotJ
267b0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
267c0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
267d0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
267e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
267f0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
26800 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
26810 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
26820 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
26830 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
26840 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
26850 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
26860 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
26870 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
26880 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
26890 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
268a0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
268b0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
268c0 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
268d0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
268e0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
268f0 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
26900 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
26910 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
26920 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
26930 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
26940 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
26950 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
26960 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
26970 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
26980 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
26990 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
269a0 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
269b0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
269c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
269d0 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
269e0 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
269f0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
26a00 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
26a10 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
26a20 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
26a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26a40 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
26a50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
26a60 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c  tate<EXCLUSIVE_L
26a70 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  OCK ){.        r
26a80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
26a90 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
26aa0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
26ab0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26ac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26ad0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
26ae0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
26af0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  c);.          go
26b00 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
26b10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
26b20 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
26b30 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
26b40 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
26b50 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
26b60 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
26b70 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73   access. This is
26b80 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20   because in .   
26b90 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d     ** exclusive-
26ba0 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
26bb0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
26bc0 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
26bd0 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70  n and.      ** p
26be0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
26bf0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
26c00 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65  ater on. On some
26c10 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20   systems, the.  
26c20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74      ** OsTruncat
26c30 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e  e() call used in
26c40 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
26c50 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75  s mode also requ
26c60 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  ires.      ** a 
26c70 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20  read/write file 
26c80 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  handle..      */
26c90 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70  .      if( !isOp
26ca0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
26cb0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
26cc0 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
26cd0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
26ce0 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a  (pVfs,pPager->zJ
26cf0 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43  ournal,SQLITE_AC
26d00 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73  CESS_EXISTS,&res
26d10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
26d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26d30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
26d40 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
26d50 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
26d60 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
26d70 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
26d80 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
26d90 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
26da0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  L;.            a
26db0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
26dc0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
26dd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26de0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
26df0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
26e00 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
26e10 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
26e20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
26e30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
26e40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
26e50 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
26e60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26e70 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
26e80 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
26e90 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
26ea0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
26eb0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26ed0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
26ee0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
26ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26f10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
26f20 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
26f30 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
26f40 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
26f50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
26f60 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
26f70 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
26f80 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
26f90 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
26fa0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
26fb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
26fc0 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
26fd0 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
26fe0 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20 20  r, it .         
26ff0 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
27000 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
27010 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
27020 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
27030 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75             ** fu
27040 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
27050 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
27060 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
27070 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  exist.  */.     
27080 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
27090 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
270a0 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
270b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
270c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
270d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
270e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
270f0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
27100 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65    }..      /* Re
27110 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  set the journal 
27120 73 74 61 74 75 73 20 66 69 65 6c 64 73 20 74 6f  status fields to
27130 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
27140 77 65 20 68 61 76 65 20 6e 6f 0a 20 20 20 20 20  we have no.     
27150 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
27160 72 6e 61 6c 20 61 74 20 74 68 69 73 20 74 69 6d  rnal at this tim
27170 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  e. */.      pPag
27180 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
27190 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ed = 0;.      pP
271a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
271b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
271c0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
271d0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
271e0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
271f0 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  . .      /* Make
27200 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
27210 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
27220 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
27230 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c  */. .      /* Pl
27240 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
27250 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
27260 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
27270 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
27280 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
27290 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
272a0 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
272b0 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
272c0 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
272d0 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
272e0 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
272f0 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
27300 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
27310 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
27320 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
27330 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
27340 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
27350 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
27360 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
27370 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
27380 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
27390 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
273a0 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
273b0 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
273c0 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
273d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
273e0 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
273f0 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
27400 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
27410 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27420 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  fd) ){.        r
27430 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
27440 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
27450 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
27460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27470 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
27480 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
27490 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
274a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
274b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
274c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
274d0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
274e0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
274f0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
27500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27510 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
27520 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
27530 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
27540 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
27550 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
27560 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
27570 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  e>PAGER_SHARED).
27580 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
27590 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
275a0 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74  pBackup || sqlit
275b0 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
275c0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
275d0 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)>0 ){.      /*
275e0 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
275f0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
27600 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
27610 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
27620 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
27630 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
27640 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
27650 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
27660 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
27670 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
27680 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
27690 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
276a0 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
276b0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
276c0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
276d0 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
276e0 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
276f0 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
27700 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
27710 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
27720 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
27730 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
27740 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
27750 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
27760 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
27770 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
27780 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
27790 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
277a0 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
277b0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
277c0 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
277d0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
277e0 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
277f0 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
27800 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
27810 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
27820 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
27830 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
27840 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
27850 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
27860 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
27870 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
27880 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
27890 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
278a0 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
278b0 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
278c0 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
278d0 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
278e0 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
278f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
27900 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  ;.      char dbF
27910 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
27920 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
27930 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
27940 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
27950 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
27960 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
27970 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
27980 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61          rc = pPa
27990 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
279a0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
279b0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
279c0 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
279d0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
279e0 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
279f0 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
27a00 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
27a10 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
27a20 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
27a30 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
27a40 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
27a50 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
27a60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27a70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27a80 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
27a90 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
27aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27ab0 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
27ac0 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
27ad0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
27ae0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
27af0 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
27b00 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
27b10 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
27b20 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
27b30 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
27b40 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
27b50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27b60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27b70 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
27b80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
27b90 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
27ba0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
27bb0 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
27bc0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
27bd0 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
27be0 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
27bf0 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
27c00 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
27c10 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
27c20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
27c30 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
27c40 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
27c50 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nt(pPager);.  }.
27c60 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
27c70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27c80 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e  .    /* pager_un
27c90 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
27ca0 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  p for exclusive 
27cb0 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f  mode and in-memo
27cc0 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  ry databases. */
27cd0 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
27ce0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
27cf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27d00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
27d10 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
27d20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
27d30 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
27d40 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
27d50 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
27d60 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
27d70 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
27d80 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
27d90 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
27da0 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
27db0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
27dc0 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
27dd0 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
27de0 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
27df0 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
27e00 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
27e10 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
27e20 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
27e30 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
27e40 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
27e50 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69  er){.  if( (sqli
27e60 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
27e70 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
27e80 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21 70  e)==0).   && (!p
27e90 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
27ea0 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
27eb0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20  journalOff>0) . 
27ec0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
27ed0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
27ee0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
27ef0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
27f00 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
27f10 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
27f20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20  pager pPager (a 
27f30 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  page.** referenc
27f40 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67  e has type DbPag
27f50 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75  e*). If the requ
27f60 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
27f70 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
27f80 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
27f90 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
27fa0 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
27fb0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
27fc0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
27fd0 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72  sted page is alr
27fe0 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
27ff0 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  e, it is returne
28000 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
28010 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  , a new page obj
28020 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
28030 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
28040 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64  ith data.** read
28050 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
28060 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65  se file. In some
28070 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63   cases, the pcac
28080 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a  he module may.**
28090 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61   choose not to a
280a0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
280b0 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61  ge object and ma
280c0 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  y reuse an exist
280d0 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69  ing.** object wi
280e0 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  th no outstandin
280f0 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  g references..**
28100 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61  .** The extra da
28110 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
28120 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
28130 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
28140 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  eros the .** fir
28150 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
28160 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
28170 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67  mory. If the pag
28180 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a  e requested is .
28190 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
281a0 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69  e cache when thi
281b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
281c0 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65  lled, then the e
281d0 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20  xtra.** data is 
281e0 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77  left as it was w
281f0 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a  hen the page obj
28200 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65  ect was last use
28210 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
28220 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69  database image i
28230 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
28240 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
28250 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f  e or if a .** no
28260 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
28270 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f  passed as the no
28280 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65  Content paramete
28290 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  r and the .** re
282a0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
282b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
282c0 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
282d0 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
282e0 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
282f0 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
28300 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
28310 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
28320 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
28330 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
28340 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e   .**.** If noCon
28350 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
28360 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
28370 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
28380 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
28390 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
283a0 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
283b0 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72   seperate scenar
283c0 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
283d0 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
283e0 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
283f0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
28400 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
28410 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
28420 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
28430 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
28440 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
28450 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
28460 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
28470 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
28480 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
28490 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
284a0 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
284b0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
284c0 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
284d0 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
284e0 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
284f0 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
28500 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
28510 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
28520 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
28530 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
28540 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
28550 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
28560 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
28570 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
28580 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
28590 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
285a0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
285b0 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
285c0 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
285d0 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
285e0 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
285f0 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
28600 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
28610 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
28620 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
28630 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
28640 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28650 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
28660 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
28670 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
28680 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
28690 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
286a0 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
286b0 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
286c0 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
286d0 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
286e0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
286f0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
28700 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
28710 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
28720 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
28730 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
28740 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
28750 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
28760 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
28770 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
28780 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
28790 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
287a0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
287b0 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
287c0 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
287d0 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
287e0 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
287f0 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
28800 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
28810 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
28820 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
28830 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
28840 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
28850 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
28860 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
28870 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
28880 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
28890 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
288a0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
288b0 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
288c0 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
288d0 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
288e0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
288f0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
28900 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
28910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
28920 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
28930 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
28940 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
28950 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
28960 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
28970 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
28980 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
28990 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
289a0 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
289b0 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
289c0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
289d0 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e  ther reading con
289e0 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69  tent from disk i
289f0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
28a00 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
28a10 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
28a20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
28a30 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
28a40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28a50 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c 4f  state>PAGER_UNLO
28a60 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  CK );..  if( pgn
28a70 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
28a80 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
28a90 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
28aa0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
28ab0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
28ac0 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tate, return an 
28ad0 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
28ae0 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  y. .  ** Otherwi
28af0 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20  se, request the 
28b00 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43  page from the PC
28b10 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20  ache layer. */. 
28b20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
28b30 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
28b40 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
28b50 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
28b60 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
28b70 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
28b80 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
28b90 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
28ba0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
28bb0 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61  e, pgno, 1, ppPa
28bc0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ge);.  }..  if( 
28bd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28be0 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
28bf0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
28c00 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
28c10 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
28c20 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
28c30 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
28c40 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
28c50 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
28c60 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
28c70 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
28c80 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
28c90 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
28ca0 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
28cb0 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
28cc0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
28cd0 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
28ce0 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
28cf0 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
28d00 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
28d10 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  e)->pPager==pPag
28d20 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  er || (*ppPage)-
28d30 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20  >pPager==0 );.. 
28d40 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
28d50 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
28d60 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
28d70 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
28d80 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
28d90 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
28da0 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
28db0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
28dc0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
28dd0 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
28de0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
28df0 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
28e00 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
28e10 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
28e20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
28e30 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
28e40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28e50 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b  TE_OK;..  }else{
28e60 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
28e70 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
28e80 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
28e90 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
28ea0 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
28eb0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f  initialized.  */
28ec0 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a  .    int nMax;..
28ed0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
28ee0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
28ef0 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
28f00 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
28f10 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
28f20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
28f30 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
28f40 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
28f50 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
28f60 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
28f70 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
28f80 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
28f90 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
28fa0 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
28fb0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
28fc0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
28fd0 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
28fe0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
28ff0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
29000 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29010 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
29020 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
29030 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73     }..    rc = s
29040 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
29050 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d  ount(pPager, &nM
29060 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ax);.    if( rc!
29070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29080 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
29090 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
290a0 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  }..    if( MEMDB
290b0 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67   || nMax<(int)pg
290c0 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
290d0 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
290e0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
290f0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
29100 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
29110 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
29120 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
29130 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
29140 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
29150 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
29160 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
29170 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
29180 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
29190 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
291a0 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
291b0 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
291c0 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
291d0 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
291e0 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
291f0 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
29200 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
29210 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
29220 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
29230 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
29240 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
29250 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
29260 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
29270 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
29280 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
29290 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
292a0 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
292b0 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
292c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
292d0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
292e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
292f0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
29300 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
29310 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
29320 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
29330 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
29340 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
29350 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
29360 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
29370 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
29380 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
29390 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
293a0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
293b0 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
293c0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
293d0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
293e0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
293f0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
29400 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
29410 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
29420 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
29430 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
29440 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
29450 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
29460 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
29470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29480 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
29490 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
294a0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
294b0 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
294c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
294d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
294e0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
294f0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
29500 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
29510 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
29520 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
29530 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
29540 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
29550 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
29560 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
29570 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
29580 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
29590 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
295a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
295b0 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
295c0 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
295d0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
295e0 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
295f0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
29600 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
29610 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
29620 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
29630 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
29640 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
29650 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
29660 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
29670 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
29680 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
29690 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
296a0 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72  n cache. Also, r
296b0 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a  eturn 0 if the .
296c0 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  ** pager is in P
296d0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
296e0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
296f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
29700 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67  ** or if the pag
29710 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
29720 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
29730 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a  an SQLITE_FULL..
29740 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
29750 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
29760 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
29770 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
29780 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
29790 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
297a0 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
297b0 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
297c0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
297d0 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
297e0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
297f0 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
29800 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
29810 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
29820 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
29830 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
29840 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
29850 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
29860 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
29870 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
29880 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
29890 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
298a0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
298b0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
298c0 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
298d0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
298e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
298f0 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
29900 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29910 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f 55  >state > PAGER_U
29920 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74  NLOCK );.  sqlit
29930 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
29940 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
29950 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
29960 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
29970 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
29980 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
29990 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
299a0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
299b0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
299c0 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
299d0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
299e0 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
299f0 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
29a00 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
29a10 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
29a20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
29a30 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
29a40 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
29a50 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
29a60 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
29a70 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29a80 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
29a90 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
29aa0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
29ab0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
29ac0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
29ad0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
29ae0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
29af0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
29b00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
29b10 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
29b20 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ile has already 
29b30 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73  been opened, ens
29b40 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ure that the.** 
29b50 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
29b60 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66   is open too. If
29b70 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
29b80 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a  l is not open,.*
29b90 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
29ba0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
29bb0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
29bc0 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
29bd0 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
29be0 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a  ding to plan. .*
29bf0 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  * An SQLITE_IOER
29c00 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
29c10 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
29c20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71  a call to .** sq
29c30 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 61  lite3OsOpen() fa
29c40 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
29c50 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
29c60 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
29c70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
29c80 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 28 70  ITE_OK;.  if( (p
29c90 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
29ca0 72 29 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  r) || isOpen(pPa
29cb0 67 65 72 2d 3e 6a 66 64 29 29 20 26 26 20 21 69  ger->jfd)) && !i
29cc0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
29cd0 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
29ce0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
29cf0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
29d00 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
29d10 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
29d20 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  mory ){.      sq
29d30 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
29d40 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
29d50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
29d60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
29d70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
29d80 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
29d90 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
29da0 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
29db0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29dc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
29dd0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
29de0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
29df0 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
29e00 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
29e10 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
29e20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
29e30 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
29e40 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
29e50 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
29e60 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
29e70 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
29e80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
29e90 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
29ea0 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
29eb0 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
29ec0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
29ed0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
29ee0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
29ef0 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
29f00 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
29f10 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
29f20 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
29f30 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
29f40 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
29f50 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
29f60 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
29f70 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
29f80 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
29f90 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
29fa0 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
29fb0 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
29fc0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
29fd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29fe0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
29ff0 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
2a000 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
2a010 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
2a020 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
2a030 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
2a040 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
2a050 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
2a060 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
2a070 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
2a080 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
2a090 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
2a0a0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2a0b0 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
2a0c0 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
2a0d0 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
2a0e0 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
2a0f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2a100 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
2a110 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
2a120 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
2a130 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2a140 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
2a150 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
2a160 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
2a170 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
2a180 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
2a190 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
2a1a0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
2a1b0 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
2a1c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
2a1d0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
2a1e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2a1f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a210 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2a220 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2a230 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
2a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a250 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2a260 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2a270 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
2a280 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
2a290 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20  pPager->pVfs;   
2a2a0 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
2a2b0 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f  f vfs pointer */
2a2c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2a2d0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
2a2e0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61  _RESERVED );.  a
2a2f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2a300 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
2a310 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
2a320 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2a330 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2a340 46 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  F );.  assert( p
2a350 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2a360 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
2a370 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
2a380 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
2a390 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a3a0 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
2a3b0 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
2a3c0 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
2a3d0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
2a3e0 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
2a3f0 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
2a400 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
2a410 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
2a420 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
2a430 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2a440 72 43 6f 64 65 3b 0a 0a 20 20 74 65 73 74 63 61  rCode;..  testca
2a450 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  se( pPager->dbSi
2a460 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
2a470 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2a480 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2a490 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
2a4a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2a4b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
2a4c0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
2a4d0 42 69 74 76 65 63 43 72 65 61 74 65 28 6e 50 61  BitvecCreate(nPa
2a4e0 67 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ge);.  if( pPage
2a4f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
2a500 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2a510 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2a520 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
2a530 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2a540 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
2a550 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28  y open. */.  if(
2a560 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2a570 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  >jfd) ){.    if(
2a580 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2a590 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2a5a0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
2a5b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
2a5c0 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
2a5d0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
2a5e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
2a5f0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20  st int flags =  
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a610 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f   /* VFS flags to
2a620 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
2a630 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  le */.        SQ
2a640 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2a650 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2a660 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
2a670 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  (pPager->tempFil
2a680 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28  e ? .          (
2a690 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2a6a0 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
2a6b0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
2a6c0 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28  AL):.          (
2a6d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2a6e0 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20  _JOURNAL).      
2a6f0 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49    );.#ifdef SQLI
2a700 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2a710 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72 63 20  _WRITE.      rc 
2a720 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2a730 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
2a740 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2a750 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
2a760 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
2a770 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
2a780 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  r).      );.#els
2a790 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  e.      rc = sql
2a7a0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2a7b0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2a7c0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
2a7d0 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69  flags, 0);.#endi
2a7e0 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  f.    }.    asse
2a7f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2a800 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2a810 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a  er->jfd) );.  }.
2a820 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
2a830 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
2a840 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
2a850 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
2a860 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62  en .  ** the sub
2a870 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
2a880 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
2a890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a8a0 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  ){.    /* TODO: 
2a8b0 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
2a8c0 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
2a8d0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2a8e0 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
2a8f0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2a900 62 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  bSize;.    pPage
2a910 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
2a920 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  d = 0;.    pPage
2a930 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
2a940 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
2a950 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
2a960 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
2a970 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
2a980 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
2a990 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2a9a0 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  lHdr = 0;.    rc
2a9b0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
2a9c0 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  dr(pPager);.  }.
2a9d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a9e0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  _OK && pPager->n
2a9f0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
2aa00 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
2aa10 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
2aa20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
2aa30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2aa40 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
2aa50 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
2aa60 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
2aa70 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
2aa80 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
2aa90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
2aaa0 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
2aab0 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
2aac0 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
2aad0 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
2aae0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
2aaf0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
2ab00 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
2ab10 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2ab20 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
2ab30 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
2ab40 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  t is false, then
2ab50 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
2ab60 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  t a RESERVED.** 
2ab70 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2ab80 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78  base file. If ex
2ab90 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
2aba0 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
2abb0 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53  ast.** an EXCLUS
2abc0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63  IVE lock. If suc
2abd0 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  h a lock is alre
2abe0 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63  ady held, no loc
2abf0 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  king .** functio
2ac00 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65  ns need be calle
2ac10 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  d..**.** If this
2ac20 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
2ac30 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ary or in-memory
2ac40 20 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a   file and, the j
2ac50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
2ac60 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20  ** opened if it 
2ac70 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72  has not been alr
2ac80 65 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70  eady. For a temp
2ac90 6f 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20  orary file, the 
2aca0 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74  opening .** of t
2acb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2acc0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
2acd0 6c 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 63  l there is an ac
2ace0 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a  tual need to .**
2acf0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
2ad00 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79  urnal. TODO: Why
2ad10 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72   handle temporar
2ad20 79 20 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e  y files differen
2ad30 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  tly?.**.** If th
2ad40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2ad50 73 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20  s opened (or if 
2ad60 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
2ad70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a  en), then a.** j
2ad80 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
2ad90 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2ada0 73 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a  start of it..**.
2adb0 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
2adc0 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
2add0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2ade0 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
2adf0 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
2ae00 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
2ae10 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
2ae20 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
2ae30 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
2ae40 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
2ae50 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
2ae60 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
2ae70 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
2ae80 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
2ae90 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
2aea0 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
2aeb0 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
2aec0 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
2aed0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
2aee0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
2aef0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
2af00 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
2af10 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
2af20 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
2af30 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
2af40 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
2af50 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2af60 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
2af70 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2af80 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
2af90 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
2afa0 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
2afb0 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
2afc0 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
2afd0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2afe0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
2aff0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
2b000 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
2b010 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
2b020 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
2b030 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 20 20 69 66  bjInMemory;.  if
2b040 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
2b050 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
2b060 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2b070 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
2b080 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2b090 28 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61  ( !MEMDB && !pPa
2b0a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2b0b0 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
2b0c0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
2b0d0 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74  .      /* Grab t
2b0e0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
2b0f0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49   the log file. I
2b100 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70  f successful, up
2b110 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a  grade to.      *
2b120 2a 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  * PAGER_EXCLUSIV
2b130 45 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  E state. Otherwi
2b140 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
2b150 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
2b160 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
2b170 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
2b180 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
2b190 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
2b1a0 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
2b1b0 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
2b1c0 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
2b1d0 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75   possible, the u
2b1e0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
2b1f0 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a  call it..      *
2b200 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2b210 69 74 65 33 57 61 6c 57 72 69 74 65 4c 6f 63 6b  ite3WalWriteLock
2b220 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
2b230 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2b240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b250 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2b260 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
2b270 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
2b280 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
2b290 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
2b2a0 44 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  D;.        pPage
2b2b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
2b2c0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2b2d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  else{.      /* O
2b2e0 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
2b2f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2b300 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
2b310 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65  he exFlag parame
2b320 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ter.      ** is 
2b330 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64  true, then immed
2b340 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74  iately upgrade t
2b350 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  his to an EXCLUS
2b360 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
2b370 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
2b380 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
2b390 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
2b3a0 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
2b3b0 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a  XCLUSIVE.      *
2b3c0 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20  * lock, but not 
2b3d0 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74  when obtaining t
2b3e0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
2b3f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2b400 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
2b410 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
2b420 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
2b430 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2b440 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b450 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
2b460 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
2b470 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  D;.        if( e
2b480 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
2b490 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
2b4a0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
2b4b0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
2b4c0 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
2b4d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2b4e0 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6f   /* No need to o
2b4f0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2b500 66 69 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d  file at this tim
2b510 65 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 0a 20  e.  It will be. 
2b520 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20 62 65 66     ** opened bef
2b530 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65  ore it is writte
2b540 6e 20 74 6f 2e 20 20 49 66 20 77 65 20 64 65 66  n to.  If we def
2b550 65 72 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a  er opening the j
2b560 6f 75 72 6e 61 6c 2c 0a 20 20 20 20 2a 2a 20 77  ournal,.    ** w
2b570 65 20 6d 69 67 68 74 20 73 61 76 65 20 74 68 65  e might save the
2b580 20 77 6f 72 6b 20 6f 66 20 63 72 65 61 74 69 6e   work of creatin
2b590 67 20 61 20 66 69 6c 65 20 69 66 20 74 68 65 20  g a file if the 
2b5a0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
2b5b0 2a 2a 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  ** ends up being
2b5c0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f   a no-op..    */
2b5d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f  .  }else if( isO
2b5e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2b5f0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2b600 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
2b610 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
2b620 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
2b630 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  was in exclusive
2b640 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
2b650 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d   last.    ** tim
2b660 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69  e a (read or wri
2b670 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  te) transaction 
2b680 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2b690 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a   concluded.    *
2b6a0 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63  * by this connec
2b6b0 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66  tion. Instead of
2b6c0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f   deleting the jo
2b6d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61  urnal file it wa
2b6e0 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f  s .    ** kept o
2b6f0 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77  pen and either w
2b700 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  as truncated to 
2b710 30 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68  0 bytes or its h
2b720 65 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a  eader was.    **
2b730 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
2b740 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
2b750 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
2b760 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
2b770 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2b780 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  ( pPager->nRec==
2b790 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2b7a0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
2b7b0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
2b7c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
2b7d0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
2b7e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
2b7f0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
2b800 72 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  r);.  }..  PAGER
2b810 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
2b820 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
2b830 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
2b840 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b850 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2b860 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
2b870 66 69 65 64 20 29 3b 0a 20 20 20 20 2f 2a 20 49  fied );.    /* I
2b880 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72 72  gnore any IO err
2b890 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 77  or that occurs w
2b8a0 69 74 68 69 6e 20 70 61 67 65 72 5f 65 6e 64 5f  ithin pager_end_
2b8b0 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 2e 20 54  transaction(). T
2b8c0 68 65 0a 20 20 20 20 2a 2a 20 70 75 72 70 6f 73  he.    ** purpos
2b8d0 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e of this call i
2b8e0 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 69  s to reset the i
2b8f0 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
2b900 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
2b910 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e 20 49 74  * sub-system. It
2b920 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
2b930 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  if the journal-f
2b940 69 6c 65 20 69 73 20 6e 6f 74 20 70 72 6f 70 65  ile is not prope
2b950 72 6c 79 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  rly.    ** final
2b960 69 7a 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  ized at this poi
2b970 6e 74 20 28 73 69 6e 63 65 20 69 74 20 69 73 20  nt (since it is 
2b980 6e 6f 74 20 61 20 76 61 6c 69 64 20 6a 6f 75 72  not a valid jour
2b990 6e 61 6c 20 66 69 6c 65 20 61 6e 79 77 61 79 29  nal file anyway)
2b9a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 61 67  ..    */.    pag
2b9b0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2b9c0 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
2b9d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2b9e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
2b9f0 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65  single data page
2ba00 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
2ba10 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
2ba20 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
2ba30 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  main journal or 
2ba40 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72  sub-journal as r
2ba50 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20  equired. If the 
2ba60 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
2ba70 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  into.** one of t
2ba80 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  he journals, the
2ba90 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
2baa0 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
2bab0 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f   .** Pager.pInJo
2bac0 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64  urnal bitvec and
2bad0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
2bae0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
2baf0 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61   bitvecs.** of a
2bb00 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ny open savepoin
2bb10 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ts as appropriat
2bb20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2bb30 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
2bb40 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
2bb50 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
2bb60 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70  Data;.  Pager *p
2bb70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2bb80 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
2bb90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
2bba0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2bbb0 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65   not called unle
2bbc0 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
2bbd0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2bbe0 6e 0a 20 20 2a 2a 20 73 74 61 72 74 65 64 2e 0a  n.  ** started..
2bbf0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2bc00 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2bc10 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
2bc20 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
2bc30 72 20 68 61 73 20 62 65 65 6e 20 70 72 65 76 69  r has been previ
2bc40 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20  ously detected, 
2bc50 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65 20  report the same 
2bc60 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e  error.  ** again
2bc70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
2bc80 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
2bc90 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50  de) )  return pP
2bca0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
2bcb0 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65    /* Higher-leve
2bcc0 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72  l routines never
2bcd0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
2bce0 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20  ion if database 
2bcf0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74  is not.  ** writ
2bd00 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b  able.  But check
2bd10 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f   anyway, just fo
2bd20 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  r robustness. */
2bd30 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2bd40 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  ger->readOnly) )
2bd50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
2bd60 45 52 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ERM;..  assert( 
2bd70 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
2bd80 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
2bd90 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
2bda0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
2bdb0 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
2bdc0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
2bdd0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
2bde0 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
2bdf0 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
2be00 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
2be10 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
2be20 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
2be30 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49  Pg);.  if( pageI
2be40 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
2be50 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
2be60 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61  ge(pPg) ){.    a
2be70 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
2be80 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
2be90 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
2bea0 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  ified = 1;.  }el
2beb0 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  se{..    /* If w
2bec0 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
2bed0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
2bee0 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
2bef0 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  be.    ** writte
2bf00 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
2bf10 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
2bf20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
2bf30 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72  ournal.    ** or
2bf40 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20   both..    **.  
2bf50 20 20 2a 2a 20 48 69 67 68 65 72 20 6c 65 76 65    ** Higher leve
2bf60 6c 20 72 6f 75 74 69 6e 65 73 20 73 68 6f 75 6c  l routines shoul
2bf70 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  d have already s
2bf80 74 61 72 74 65 64 20 61 20 74 72 61 6e 73 61 63  tarted a transac
2bf90 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a 20 77 68 69  tion,.    ** whi
2bfa0 63 68 20 6d 65 61 6e 73 20 74 68 65 79 20 68 61  ch means they ha
2bfb0 76 65 20 61 63 71 75 69 72 65 64 20 74 68 65 20  ve acquired the 
2bfc0 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20  necessary locks 
2bfd0 62 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  but the rollback
2bfe0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
2bff0 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65  might not yet be
2c000 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   open..    */.  
2c010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2c020 67 65 72 42 65 67 69 6e 28 70 50 61 67 65 72 2c  gerBegin(pPager,
2c030 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   0, pPager->subj
2c040 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20 20 20 20 69  InMemory);.    i
2c050 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c060 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2c070 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
2c080 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
2c090 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 26 26  r->jfd) .     &&
2c0a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2c0b0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2c0c0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
2c0d0 20 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61    && !pagerUseWa
2c0e0 6c 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 7b  l(pPager).    ){
2c0f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2c100 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2c110 6c 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  l );.      rc = 
2c120 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
2c130 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
2c140 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c150 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
2c160 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
2c170 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
2c180 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  1;.  .    /* The
2c190 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
2c1a0 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
2c1b0 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
2c1c0 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
2c1d0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
2c1e0 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
2c1f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
2c200 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
2c210 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
2c220 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2c230 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
2c240 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
2c250 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
2c260 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61  f( !pageInJourna
2c270 6c 28 70 50 67 29 20 26 26 20 69 73 4f 70 65 6e  l(pPg) && isOpen
2c280 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
2c290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2c2a0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2c2b0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  er) );.      if(
2c2c0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67   pPg->pgno<=pPag
2c2d0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
2c2e0 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
2c2f0 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
2c300 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20  r *pData2;..    
2c310 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
2c320 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
2c330 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2c340 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
2c350 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
2c360 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
2c370 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
2c380 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
2c390 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  ifies.        **
2c3a0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
2c3b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2c3c0 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
2c3d0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
2c3e0 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  ger) );..       
2c3f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c400 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
2c410 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2c420 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  f );.        COD
2c430 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
2c440 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
2c450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2c460 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
2c470 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
2c480 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
2c490 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
2c4a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
2c4b0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
2c4c0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
2c4d0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e  ournalOff, pPg->
2c4e0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
2c4f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2c510 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2c520 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
2c530 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
2c540 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
2c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c560 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
2c570 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a  ournalOff + 4);.
2c580 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2c590 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
2c5a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2c5b0 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +4;.        }.  
2c5c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2c5d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c5e0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
2c5f0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
2c600 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
2c610 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20  alOff, cksum);. 
2c620 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2c630 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
2c640 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c650 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
2c660 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
2c670 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
2c680 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
2c690 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2c6a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
2c6b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
2c6c0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f  ;.        PAGER_
2c6d0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
2c6e0 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29  er_writej_count)
2c6f0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
2c700 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE(("JOURNAL %
2c710 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
2c720 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
2c730 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2c740 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
2c750 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  ), pPg->pgno, . 
2c760 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
2c770 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2c780 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20  EED_SYNC)?1:0), 
2c790 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
2c7a0 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  Pg)));..        
2c7b0 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f  /* Even if an IO
2c7c0 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72   or diskfull err
2c7d0 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  or occurred whil
2c7e0 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68  e journalling th
2c7f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2c800 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  e in the block a
2c810 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65  bove, set the ne
2c820 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72  ed-sync flag for
2c830 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20   the page..     
2c840 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
2c850 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
2c860 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
2c870 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20  back, the logic 
2c880 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c  in.        ** pl
2c890 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
2c8a0 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61  ) will think tha
2c8b0 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
2c8c0 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a   to be restored.
2c8d0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
2c8e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2c8f0 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72   And if an IO er
2c900 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2c910 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20   doing so,.     
2c920 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75     ** then corru
2c930 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77  ption may follow
2c940 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2c950 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
2c960 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2c970 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
2c980 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
2c990 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70  YNC;.          p
2c9a0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
2c9b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 1;.        }..
2c9c0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72          /* An er
2c9d0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
2c9e0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
2c9f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
2ca00 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  e .        ** tr
2ca10 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
2ca20 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
2ca30 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
2ca40 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2ca50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ca60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ca70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ca80 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2ca90 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
2caa0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2cab0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
2cac0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
2cad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2cae0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
2caf0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
2cb00 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
2cb10 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
2cb20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
2cb30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
2cb40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
2cb50 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
2cb60 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c   );.        rc |
2cb70 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
2cb80 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
2cb90 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2cba0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cbb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2cbc0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2cbd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
2cbe0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2cbf0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2cc00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cc10 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2cc20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26  journalStarted &
2cc30 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
2cc40 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
2cc50 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
2cc60 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
2cc70 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2cc80 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
2cc90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cca0 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50  PAGERTRACE(("APP
2ccb0 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
2ccc0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
2ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
2cce0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2ccf0 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
2cd00 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
2cd10 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2cd20 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a  D_SYNC)?1:0)));.
2cd30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2cd40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
2cd50 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
2cd60 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2cd70 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
2cd80 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
2cd90 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
2cda0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
2cdb0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
2cdc0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
2cdd0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
2cde0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
2cdf0 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
2ce00 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
2ce10 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
2ce20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
2ce30 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
2ce40 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
2ce50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75     */.    if( su
2ce60 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
2ce70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Pg) ){.      rc 
2ce80 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
2ce90 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
2cea0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
2ceb0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
2cec0 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
2ced0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2cee0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2cef0 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
2cf00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
2cf10 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
2cf20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
2cf30 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a   pPg->pgno;.  }.
2cf40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2cf50 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
2cf60 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
2cf70 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ble. This routin
2cf80 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
2cf90 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69   before .** maki
2cfa0 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20  ng changes to a 
2cfb0 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72  page. The caller
2cfc0 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
2cfd0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a  return value .**
2cfe0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2cff0 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  n and be careful
2d000 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61   not to change a
2d010 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c  ny page data unl
2d020 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ess .** this rou
2d030 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
2d040 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  ITE_OK..**.** Th
2d050 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2d060 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
2d070 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
2d080 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
2d090 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
2d0a0 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
2d0b0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
2d0c0 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
2d0d0 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
2d0e0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
2d0f0 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
2d100 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
2d110 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
2d120 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
2d130 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2d140 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
2d150 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
2d160 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2d170 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  , SQLITE_NOMEM o
2d180 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
2d190 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  de is returned.*
2d1a0 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  * as appropriate
2d1b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
2d1c0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
2d1d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d1e0 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
2d1f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2d200 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
2d210 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
2d220 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2d230 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2d240 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
2d250 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
2d260 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
2d270 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
2d280 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72 53  .  if( nPagePerS
2d290 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
2d2a0 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
2d2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2d2c0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
2d2d0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
2d2e0 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
2d2f0 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
2d300 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
2d310 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
2d320 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
2d330 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
2d340 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2d350 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d360 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
2d370 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
2d380 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
2d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2d3b0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65  er */.    int ne
2d3c0 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20  edSync = 0;     
2d3d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2d3e0 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44  ny page has PGHD
2d3f0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a  R_NEED_SYNC */..
2d400 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
2d410 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f  oNotSync flag to
2d420 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
2d430 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
2d440 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  low a journal.  
2d450 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62    ** header to b
2d460 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
2d470 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
2d480 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75  naled by this fu
2d490 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
2d4a0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
2d4b0 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
2d4c0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
2d4d0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
2d4e0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
2d4f0 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
2d500 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
2d510 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
2d520 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
2d530 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
2d540 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
2d550 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
2d560 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
2d570 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
2d580 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
2d590 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
2d5a0 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
2d5b0 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
2d5c0 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
2d5d0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
2d5e0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
2d5f0 20 2b 20 31 3b 0a 0a 20 20 20 20 72 63 20 3d 20   + 1;..    rc = 
2d600 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2d610 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69  count(pPager, (i
2d620 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74  nt *)&nPageCount
2d630 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2d640 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
2d650 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
2d660 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
2d670 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
2d680 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
2d690 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
2d6a0 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
2d6b0 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
2d6c0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
2d6d0 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
2d6e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d6f0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
2d700 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
2d710 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
2d720 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
2d730 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
2d740 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
2d750 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
2d760 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
2d770 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
2d780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
2d790 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
2d7a0 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
2d7b0 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
2d7c0 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70  .      if( pg==p
2d7d0 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c  Pg->pgno || !sql
2d7e0 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
2d7f0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2d800 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20  l, pg) ){.      
2d810 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
2d820 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
2d830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2d840 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2d850 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
2d860 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2d870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d880 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2d890 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
2d8a0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
2d8b0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2d8c0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2d8d0 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
2d8e0 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
2d8f0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
2d900 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
2d910 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
2d920 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2d930 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d940 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
2d950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2d960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d970 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
2d980 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
2d990 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
2d9a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
2d9b0 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
2d9c0 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
2d9d0 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
2d9e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2d9f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2da00 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
2da10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2da20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
2da30 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2da40 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61  lag is set for a
2da50 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20  ny of the nPage 
2da60 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74  pages .    ** st
2da70 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74  arting at pg1, t
2da80 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20  hen it needs to 
2da90 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f  be set for all o
2daa0 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a  f them. Because.
2dab0 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74      ** writing t
2dac0 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e  o any of these n
2dad0 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64  Page pages may d
2dae0 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73  amage the others
2daf0 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  , the.    ** jou
2db00 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63  rnal file must c
2db10 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20  ontain sync()ed 
2db20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66  copies of all of
2db30 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66   them.    ** bef
2db40 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  ore any of them 
2db50 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
2db60 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2db70 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
2db80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2db90 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e  TE_OK && needSyn
2dba0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
2dbb0 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  t( !MEMDB && pPa
2dbc0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29  ger->noSync==0 )
2dbd0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
2dbe0 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b  ; ii<nPage; ii++
2dbf0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
2dc00 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   *pPage = pager_
2dc10 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
2dc20 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20  g1+ii);.        
2dc30 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
2dc40 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c         pPage->fl
2dc50 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
2dc60 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
2dc70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2dc80 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
2dc90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2dca0 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
2dcb0 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r->needSync);.  
2dcc0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
2dcd0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
2dce0 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  nc==1 );.    pPa
2dcf0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
2dd00 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2dd10 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2dd20 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
2dd30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2dd40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2dd50 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
2dd60 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
2dd70 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
2dd80 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
2dd90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2dda0 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
2ddb0 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
2ddc0 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
2ddd0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
2dde0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
2ddf0 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
2de00 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
2de10 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2de20 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
2de30 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c    return pPg->fl
2de40 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b  ags&PGHDR_DIRTY;
2de50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2de60 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
2de70 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
2de80 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
2de90 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
2dea0 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
2deb0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
2dec0 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f  page pPg back to
2ded0 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
2dee0 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
2def0 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
2df00 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 54  ked as dirty.  T
2df10 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72  his happens, for
2df20 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a   example, when.*
2df30 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62  * the page has b
2df40 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c  een added as a l
2df50 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c  eaf of the freel
2df60 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a  ist and so its.*
2df70 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e  * content no lon
2df80 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a  ger matters..**.
2df90 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67  ** The overlying
2dfa0 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20   software layer 
2dfb0 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
2dfc0 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74  ne when all of t
2dfd0 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68  he data.** on th
2dfe0 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20  e given page is 
2dff0 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67 65  unused. The page
2e000 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
2e010 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
2e020 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
2e030 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
2e040 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
2e050 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
2e060 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
2e070 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  n quadruple the 
2e080 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a  speed of large .
2e090 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  ** DELETE operat
2e0a0 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ions..*/.void sq
2e0b0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2e0c0 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
2e0d0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2e0e0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2e0f0 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67    if( (pPg->flag
2e100 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26  s&PGHDR_DIRTY) &
2e110 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  & pPager->nSavep
2e120 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50  oint==0 ){.    P
2e130 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54  AGERTRACE(("DONT
2e140 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
2e150 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
2e160 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
2e170 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41  er)));.    IOTRA
2e180 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64  CE(("CLEAN %p %d
2e190 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
2e1a0 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67  ->pgno)).    pPg
2e1b0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
2e1c0 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66  _DONT_WRITE;.#if
2e1d0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
2e1e0 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
2e1f0 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
2e200 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
2e210 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
2e220 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2e230 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
2e240 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
2e250 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2e260 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67  e file .** chang
2e270 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65  e-counter, store
2e280 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69  d as a 4-byte bi
2e290 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2e2a0 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a   starting at .**
2e2b0 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2e2c0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
2e2d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2e2e0 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
2e2f0 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  g is zero, then 
2e300 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20  this is done by 
2e310 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
2e320 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2e330 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  on page 1, then 
2e340 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
2e350 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
2e360 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74   page data. In t
2e370 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c  his case the fil
2e380 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65  e will be update
2e390 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  d when the curre
2e3a0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
2e3b0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
2e3c0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65  **.** The isDire
2e3d0 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20  ctMode flag may 
2e3e0 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  only be non-zero
2e3f0 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   if the library 
2e400 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20  was compiled.** 
2e410 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
2e420 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2e430 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ITE macro define
2e440 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  d. In this case,
2e450 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20  .** if isDirect 
2e460 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2e470 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2e480 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64  ile is updated d
2e490 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72  irectly.** by wr
2e4a0 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64  iting an updated
2e4b0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
2e4c0 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20   1 using a call 
2e4d0 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  to the .** sqlit
2e4e0 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63  e3OsWrite() func
2e4f0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2e500 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
2e510 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
2e520 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2e530 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20  isDirectMode){. 
2e540 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e550 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61  _OK;..  /* Decla
2e560 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  re and initializ
2e570 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  e constant integ
2e580 65 72 20 27 69 73 44 69 72 65 63 74 27 2e 20 49  er 'isDirect'. I
2e590 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69  f the.  ** atomi
2e5a0 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2e5b0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
2e5c0 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74  in this build, t
2e5d0 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a  hen isDirect.  *
2e5e0 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  * is initialized
2e5f0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
2e600 73 73 65 64 20 61 73 20 74 68 65 20 69 73 44 69  ssed as the isDi
2e610 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74  rectMode paramet
2e620 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  er.  ** to this 
2e630 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  function. Otherw
2e640 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79  ise, it is alway
2e650 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20  s set to zero.. 
2e660 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65   **.  ** The ide
2e670 61 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  a is that if the
2e680 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2e690 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f  timization is no
2e6a0 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61  t.  ** enabled a
2e6b0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2e6c0 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e  the compiler can
2e6d0 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73 20   omit the tests 
2e6e0 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63  of.  ** 'isDirec
2e6f0 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c  t' below, as wel
2e700 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65  l as the block e
2e710 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20  nclosed in the. 
2e720 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65 63   ** "if( isDirec
2e730 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a  t )" condition..
2e740 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2e750 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2e760 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65  C_WRITE.# define
2e770 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20   DIRECT_MODE 0. 
2e780 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63   assert( isDirec
2e790 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e  tMode==0 );.  UN
2e7a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
2e7b0 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65  sDirectMode);.#e
2e7c0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52  lse.# define DIR
2e7d0 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63  ECT_MODE isDirec
2e7e0 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20  tMode.#endif..  
2e7f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2e800 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
2e810 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21  ERVED );.  if( !
2e820 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2e830 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65  untDone && pPage
2e840 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
2e850 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
2e860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e870 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f   /* Reference to
2e880 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75   page 1 */.    u
2e890 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
2e8a0 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
2e8b0 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  Initial value of
2e8c0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2e8d0 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73  field */..    as
2e8e0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
2e8f0 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65  empFile && isOpe
2e900 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
2e910 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61  ..    /* Open pa
2e920 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
2e930 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
2e940 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2e950 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
2e960 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  , 1, &pPgHdr);. 
2e970 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64     assert( pPgHd
2e980 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  r==0 || rc==SQLI
2e990 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
2e9a0 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73   If page one was
2e9b0 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73   fetched success
2e9c0 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20  fully, and this 
2e9d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  function is not.
2e9e0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67      ** operating
2e9f0 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c   in direct-mode,
2ea00 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69   make page 1 wri
2ea10 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74  table.  When not
2ea20 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65   in .    ** dire
2ea30 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20  ct mode, page 1 
2ea40 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69  is always held i
2ea50 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63  n cache and henc
2ea60 65 20 74 68 65 20 50 61 67 65 72 47 65 74 28 29  e the PagerGet()
2ea70 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73  .    ** above is
2ea80 20 61 6c 77 61 79 73 20 73 75 63 63 65 73 73 66   always successf
2ea90 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41  ul - hence the A
2eaa0 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c  LWAYS on rc==SQL
2eab0 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20  ITE_OK..    */. 
2eac0 20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d     if( !DIRECT_M
2ead0 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28 72 63  ODE && ALWAYS(rc
2eae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a  ==SQLITE_OK) ){.
2eaf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2eb00 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
2eb10 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hdr);.    }..   
2eb20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2eb30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
2eb40 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
2eb50 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
2eb60 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
2eb70 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
2eb80 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
2eb90 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
2eba0 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72  byte((u8*)pPager
2ebb0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20  ->dbFileVers);. 
2ebc0 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e       change_coun
2ebd0 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74  ter++;.      put
2ebe0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
2ebf0 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34  PgHdr->pData)+24
2ec00 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
2ec10 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 73  );..      /* Als
2ec20 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
2ec30 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
2ec40 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
2ec50 39 20 2a 2f 0a 20 20 20 20 20 20 70 75 74 33 32  9 */.      put32
2ec60 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
2ec70 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20  Hdr->pData)+96, 
2ec80 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
2ec90 55 4d 42 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f  UMBER);..      /
2eca0 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
2ecb0 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69  direct mode, wri
2ecc0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2ecd0 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68 65  of page 1 to the
2ece0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
2ecf0 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  if( DIRECT_MODE 
2ed00 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2ed10 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50   void *zBuf = pP
2ed20 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20  gHdr->pData;.   
2ed30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2ed40 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
2ed50 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2ed60 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2ed70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
2ed80 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
2ed90 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ize, 0);.       
2eda0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2edb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2edc0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2edd0 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
2ede0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2edf0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67  se{.        pPag
2ee00 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2ee10 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
2ee20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
2ee30 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
2ee40 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
2ee50 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2ee60 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
2ee70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ee80 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
2ee90 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
2eea0 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  sk. This is a no
2eeb0 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  -op for in-memor
2eec0 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61  y files.** or pa
2eed0 67 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67  ges with the Pag
2eee0 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73  er.noSync flag s
2eef0 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  et..**.** If suc
2ef00 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c  cessful, or call
2ef10 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f  ed on a pager fo
2ef20 72 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20  r which it is a 
2ef30 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66  no-op, this.** f
2ef40 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2ef50 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
2ef60 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f  wise, an IO erro
2ef70 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2ef80 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2ef90 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
2efa0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2efb0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efd0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2efe0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  e */.  assert( !
2eff0 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
2f000 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2f010 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2f020 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2f030 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f040 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
2f050 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
2f060 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ags);.  }.  retu
2f070 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2f080 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
2f090 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
2f0a0 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
2f0b0 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
2f0c0 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
2f0d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2f0e0 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
2f0f0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
2f100 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
2f110 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
2f120 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
2f130 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
2f140 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
2f150 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
2f160 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
2f170 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
2f180 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
2f190 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
2f1a0 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  at:.**.**   * Th
2f1b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2f1c0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
2f1d0 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20  s updated,.**   
2f1e0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
2f1f0 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20   synced (unless 
2f200 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2f210 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2f220 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61   used),.**   * a
2f230 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 61  ll dirty pages a
2f240 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  re written to th
2f250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2f260 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74   .**   * the dat
2f270 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 72  abase file is tr
2f280 75 6e 63 61 74 65 64 20 28 69 66 20 72 65 71 75  uncated (if requ
2f290 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20  ired), and.**   
2f2a0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
2f2b0 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a  ile synced. .**.
2f2c0 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  ** The only thin
2f2d0 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  g that remains t
2f2e0 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
2f2f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66  nsaction is to f
2f300 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c  inalize .** (del
2f310 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72  ete, truncate or
2f320 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20   zero the first 
2f330 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75  part of) the jou
2f340 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a  rnal file (or .*
2f350 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * delete the mas
2f360 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2f370 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
2f380 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2f390 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
2f3a0 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
2f3b0 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
2f3c0 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
2f3d0 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
2f3e0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
2f3f0 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a  seOne() call..**
2f400 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c  .** If the final
2f410 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53   parameter - noS
2f420 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74  ync - is true, t
2f430 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
2f440 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20   file itself.** 
2f450 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54  is not synced. T
2f460 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
2f470 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2f480 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20  Sync() directly 
2f490 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64  to.** sync the d
2f4a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
2f4b0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d  ore calling Comm
2f4c0 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20  itPhaseTwo() to 
2f4d0 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  delete the.** jo
2f4e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68  urnal file in th
2f4f0 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  is case..*/.int 
2f500 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
2f510 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61  itPhaseOne(.  Pa
2f520 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
2f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f540 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
2f550 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2f560 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20 20 20  Master,         
2f570 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
2f580 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  L, the master jo
2f590 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
2f5a0 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20  int noSync      
2f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5c0 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
2f5d0 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65  the xSync on the
2f5e0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20   db file */.){. 
2f5f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2f600 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2f610 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2f620 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 64 62 4f  */..  /* The dbO
2f630 72 69 67 53 69 7a 65 20 69 73 20 6e 65 76 65 72  rigSize is never
2f640 20 73 65 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f   set if journal_
2f650 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a 20 20 61 73  mode=OFF */.  as
2f660 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
2f670 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2f680 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2f690 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72   || pPager->dbOr
2f6a0 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 0a 20 20  igSize==0 );..  
2f6b0 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20 65 72  /* If a prior er
2f6c0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65  ror occurred, re
2f6d0 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f 72 20  port that error 
2f6e0 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  again. */.  if( 
2f6f0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
2f700 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
2f710 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2f720 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2f730 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
2f740 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
2f750 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20  %s nSize=%d\n", 
2f760 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
2f770 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
2f780 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
2f790 65 29 29 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  e));..  if( MEMD
2f7a0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  B && pPager->dbM
2f7b0 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20 20 2f  odified ){.    /
2f7c0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2f7d0 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
2f7e0 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
2f7f0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
2f800 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66  or this.    ** f
2f810 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
2f820 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
2f830 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20   it is mostly a 
2f840 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c  no-op.  However,
2f850 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b   any.    ** back
2f860 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e  up in progress n
2f870 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 61  eeds to be resta
2f880 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rted..    */.   
2f890 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
2f8a0 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
2f8b0 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 20  ackup);.  }else 
2f8c0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
2f8d0 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
2f8e0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  && pPager->dbMod
2f8f0 69 66 69 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ified ){.    if(
2f900 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2f910 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50 67  ger) ){.      Pg
2f920 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  Hdr *pList = sql
2f930 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
2f940 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
2f950 63 68 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  che);.      if( 
2f960 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
2f970 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
2f980 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 4c 69  ames(pPager, pLi
2f990 73 74 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  st, pPager->dbSi
2f9a0 7a 65 2c 20 31 2c 20 0a 20 20 20 20 20 20 20 20  ze, 1, .        
2f9b0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 66 75 6c      (pPager->ful
2f9c0 6c 53 79 6e 63 20 3f 20 70 50 61 67 65 72 2d 3e  lSync ? pPager->
2f9d0 73 79 6e 63 5f 66 6c 61 67 73 20 3a 20 30 29 0a  sync_flags : 0).
2f9e0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2f9f0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2fa00 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
2fa10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2fa20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fa30 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2fa40 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  ng block updates
2fa50 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2fa60 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ter. Exactly how
2fa70 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65   it.      ** doe
2fa80 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f  s this depends o
2fa90 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
2faa0 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
2fab0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
2fac0 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61        ** was ena
2fad0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
2fae0 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69  time, and if thi
2faf0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65  s transaction me
2fb00 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ets the .      *
2fb10 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72  * runtime criter
2fb20 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70  ia to use the op
2fb30 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20  eration: .      
2fb40 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  **.      **    *
2fb50 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
2fb60 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
2fb70 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
2fb80 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  rty for.      **
2fb90 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
2fba0 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
2fbb0 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20  and .      **   
2fbc0 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
2fbd0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
2fbe0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
2fbf0 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
2fc00 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c    **    * Exactl
2fc10 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
2fc20 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
2fc30 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
2fc40 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
2fc50 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
2fc60 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
2fc70 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65  n was not enable
2fc80 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
2fc90 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  e, then the.    
2fca0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
2fcb0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2fcc0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2fcd0 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
2fce0 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a   change.      **
2fcf0 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64   counter in 'ind
2fd00 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20  irect-mode'. If 
2fd10 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
2fd20 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
2fd30 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  but.      ** is 
2fd40 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74  not applicable t
2fd50 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  o this transacti
2fd60 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  on, call sqlite3
2fd70 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a  JournalCreate().
2fd80 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65        ** to make
2fd90 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
2fda0 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61  l file has actua
2fdb0 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  lly been created
2fdc0 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20  , then call.    
2fdd0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
2fde0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2fdf0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2fe00 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
2fe10 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a  indirect.      *
2fe20 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a  * mode. .      *
2fe30 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72  *.      ** Other
2fe40 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74  wise, if the opt
2fe50 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74  imization is bot
2fe60 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70  h enabled and ap
2fe70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20  plicable,.      
2fe80 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67  ** then call pag
2fe90 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2fea0 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74  unter() to updat
2feb0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
2fec0 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e  nter.      ** in
2fed0 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20   'direct' mode. 
2fee0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2fef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
2ff00 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20  ll never be.    
2ff10 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
2ff20 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2ff30 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  n..      */.  #i
2ff40 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2ff50 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2ff60 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
2ff70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ff80 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2ff90 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  fd) || pPager->j
2ffa0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2ffb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2ffc0 46 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  F );.      if( !
2ffd0 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65  zMaster && isOpe
2ffe0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a  n(pPager->jfd) .
2fff0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
30000 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
30010 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
30020 67 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20  ger) .       && 
30030 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
30040 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
30050 7a 65 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d  ze.       && (0=
30060 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50  =(pPg = sqlite3P
30070 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
30080 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
30090 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72   || 0==pPg->pDir
300a0 74 79 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ty).      ){.   
300b0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
300c0 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
300d0 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68  e counter via th
300e0 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d  e direct-write m
300f0 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20  ethod. The .    
30100 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
30110 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66   call will modif
30120 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  y the in-memory 
30130 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
30140 66 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  f page 1 .      
30150 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20    ** to include 
30160 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e  the updated chan
30170 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74  ge counter and t
30180 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31  hen write page 1
30190 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72   .        ** dir
301a0 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
301b0 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61  abase file. Beca
301c0 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69  use of the atomi
301d0 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 20  c-write .       
301e0 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20   ** property of 
301f0 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
30200 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61  stem, this is sa
30210 66 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  fe..        */. 
30220 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
30230 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
30240 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
30250 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30260 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30270 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
30280 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
30290 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
302a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
302b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
302c0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
302d0 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
302e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
302f0 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72  .  #else.      r
30300 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
30310 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
30320 67 65 72 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69  ger, 0);.  #endi
30330 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  f.      if( rc!=
30340 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
30350 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
30360 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
30370 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
30380 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
30390 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
303a0 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
303b0 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 62  pages.      ** b
303c0 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
303d0 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
303e0 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
303f0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
30400 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54        ** file. T
30410 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
30420 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
30430 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  um mode..      *
30440 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72  *.      ** Befor
30450 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61  e reading the pa
30460 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
30470 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74 68 61  mbers larger tha
30480 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
30490 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
304a0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73   Pager.dbSize, s
304b0 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74  et dbSize back t
304c0 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  o the value.    
304d0 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f    ** that it too
304e0 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  k at the start o
304f0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
30500 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  n. Otherwise, th
30510 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73  e.      ** calls
30520 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
30530 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72  Get() return zer
30540 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61  oed pages instea
30550 64 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 72  d of .      ** r
30560 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  eading data from
30570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30580 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
30590 20 20 20 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e     ** When journ
305a0 61 6c 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65  al_mode==OFF the
305b0 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61   dbOrigSize is a
305c0 6c 77 61 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74  lways zero, so t
305d0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  his.      ** blo
305e0 63 6b 20 6e 65 76 65 72 20 72 75 6e 73 20 69 66  ck never runs if
305f0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46   journal_mode=OF
30600 46 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  F..      */.  #i
30610 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30620 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30630 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
30640 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
30650 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 20  OrigSize .      
30660 20 26 26 20 41 4c 57 41 59 53 28 70 50 61 67 65   && ALWAYS(pPage
30670 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
30680 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
30690 45 5f 4f 46 46 29 0a 20 20 20 20 20 20 29 7b 0a  E_OFF).      ){.
306a0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20          Pgno i; 
306b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306d0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
306e0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
306f0 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b    const Pgno iSk
30700 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
30710 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50  NO(pPager); /* P
30720 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65  ending lock page
30730 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
30740 74 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20  t Pgno dbSize = 
30750 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20  pPager->dbSize; 
30760 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
30770 65 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20  e image size */ 
30780 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
30790 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
307a0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
307b0 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53        for( i=dbS
307c0 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  ize+1; i<=pPager
307d0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b  ->dbOrigSize; i+
307e0 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  + ){.          i
307f0 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  f( !sqlite3Bitve
30800 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
30810 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20  nJournal, i) && 
30820 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
30830 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
30840 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
30850 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75    /* Page to jou
30860 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  rnal */.        
30870 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30880 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
30890 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
308a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
308b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
308c0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
308d0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
308e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
308f0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
30900 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
30910 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
30920 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
30930 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30940 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
30950 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
30960 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
30970 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
30980 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
30990 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20  ze = dbSize;.   
309a0 20 20 20 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20     } .  #endif. 
309b0 20 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65   .      /* Write
309c0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
309d0 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
309e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
309f0 49 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20  If a master .   
30a00 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
30a10 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
30a20 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
30a30 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
30a40 66 69 6c 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20  file, .      ** 
30a50 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73  or if zMaster is
30a60 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72   NULL (no master
30a70 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20   journal), then 
30a80 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
30a90 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  o-op..      */. 
30aa0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
30ab0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
30ac0 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
30ad0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30ae0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
30af0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
30b00 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  xit;.  .      /*
30b10 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
30b20 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61  l file. If the a
30b30 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
30b40 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69  imization is bei
30b50 6e 67 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64  ng.      ** used
30b60 2c 20 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c  , this call will
30b70 20 6e 6f 74 20 63 72 65 61 74 65 20 74 68 65 20   not create the 
30b80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
30b90 70 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20  perform any.    
30ba0 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20    ** real IO..  
30bb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
30bc0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
30bd0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
30be0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30bf0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
30c00 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a  se_one_exit;.  .
30c10 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61        /* Write a
30c20 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
30c30 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
30c40 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ile. */.      rc
30c50 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
30c60 61 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50  agelist(sqlite3P
30c70 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
30c80 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
30c90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
30ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
30cc0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
30cd0 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 20  OCKED );.       
30ce0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
30cf0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
30d00 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
30d10 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
30d20 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
30d30 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  );.  .      /* I
30d40 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
30d50 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  sk is not the sa
30d60 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64  me size as the d
30d70 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20  atabase image,. 
30d80 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65       ** then use
30d90 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20   pager_truncate 
30da0 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e  to grow or shrin
30db0 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e  k the file here.
30dc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30dd0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
30de0 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze!=pPager->dbFi
30df0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
30e00 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50    Pgno nNew = pP
30e10 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28  ager->dbSize - (
30e20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
30e30 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
30e40 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
30e50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30e60 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
30e70 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20  LUSIVE );.      
30e80 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
30e90 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e  ncate(pPager, nN
30ea0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
30eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30ec0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
30ed0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
30ee0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
30ef0 20 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74   Finally, sync t
30f00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30f10 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21  . */.      if( !
30f20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26  pPager->noSync &
30f30 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  & !noSync ){.   
30f40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30f50 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
30f60 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
30f70 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d  _flags);.      }
30f80 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
30f90 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
30fa0 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 0a 20  Pager)).    }.. 
30fb0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
30fc0 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
30fd0 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61  .  }..commit_pha
30fe0 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72  se_one_exit:.  r
30ff0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
31000 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
31010 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
31020 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
31030 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  ile has been com
31040 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74  pletely.** updat
31050 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ed to reflect th
31060 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
31070 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  y the current tr
31080 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  ansaction and.**
31090 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
310a0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
310b0 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69  e still exists i
310c0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
310d0 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e  m .** though, an
310e0 64 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  d if a failure o
310f0 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
31100 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e  int it will even
31110 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65  tually.** be use
31120 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
31130 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  al and the curre
31140 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  nt transaction r
31150 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
31160 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
31170 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
31180 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68  urnal file, eith
31190 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20  er by deleting, 
311a0 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  .** truncating o
311b0 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f  r partially zero
311c0 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20  ing it, so that 
311d0 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  it cannot be use
311e0 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f  d .** for hot-jo
311f0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
31200 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e  Once this is don
31210 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
31220 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61  n is.** irrevoca
31230 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  bly committed..*
31240 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
31250 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
31260 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
31270 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
31280 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74  ger.** moves int
31290 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
312a0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
312b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
312c0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
312d0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
312e0 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
312f0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
31300 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
31310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31320 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
31330 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
31340 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ne should not be
31350 20 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69   called if a pri
31360 6f 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  or error has occ
31370 75 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  urred..  ** But 
31380 69 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64  if (due to a cod
31390 69 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68  ing error elsewh
313a0 65 72 65 20 69 6e 20 74 68 65 20 73 79 73 74 65  ere in the syste
313b0 6d 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20  m) it does get. 
313c0 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74   ** called, just
313d0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
313e0 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68   error code with
313f0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
31400 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ng. */.  if( NEV
31410 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
31420 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
31430 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
31440 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
31450 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  n should not be 
31460 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61  called if the pa
31470 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74  ger is not in at
31480 20 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45   least.  ** PAGE
31490 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
314a0 2e 20 41 6e 64 20 69 6e 64 65 65 64 20 53 51 4c  . And indeed SQL
314b0 69 74 65 20 6e 65 76 65 72 20 64 6f 65 73 20 74  ite never does t
314c0 68 69 73 2e 20 42 75 74 20 69 74 20 69 73 0a 20  his. But it is. 
314d0 20 2a 2a 20 6e 69 63 65 20 74 6f 20 68 61 76 65   ** nice to have
314e0 20 74 68 69 73 20 64 65 66 65 6e 73 69 76 65 20   this defensive 
314f0 74 65 73 74 20 68 65 72 65 20 61 6e 79 77 61 79  test here anyway
31500 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
31510 45 52 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ER(pPager->state
31520 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 29  <PAGER_RESERVED)
31530 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
31540 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e  _ERROR;..  /* An
31550 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49   optimization. I
31560 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  f the database w
31570 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
31580 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a  modified during.
31590 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
315a0 63 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72  ction, the pager
315b0 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
315c0 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e  xclusive-mode an
315d0 64 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20  d is.  ** using 
315e0 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
315f0 61 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66  als, then this f
31600 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
31610 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  op..  **.  ** Th
31620 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
31630 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72  ournal file curr
31640 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61  ently contains a
31650 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20   single journal 
31660 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74  .  ** header wit
31670 68 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  h the nRec field
31680 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75   set to 0. If su
31690 63 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ch a journal is 
316a0 75 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68  used as.  ** a h
316b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e  ot-journal durin
316c0 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
316d0 6c 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65  llback, 0 change
316e0 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20  s will be made. 
316f0 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
31700 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65  ase file. So the
31710 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
31720 20 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61   zero the journa
31730 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20  l .  ** header. 
31740 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20  Since the pager 
31750 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
31760 6d 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e  mode, there is n
31770 6f 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64  o need.  ** to d
31780 72 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69  rop any locks ei
31790 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
317a0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
317b0 69 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ied==0 && pPager
317c0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
317d0 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  .   && pPager->j
317e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
317f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
31800 52 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61  RSIST.  ){.    a
31810 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
31820 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
31830 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
31840 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
31850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
31860 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
31870 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
31880 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
31890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
318a0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
318b0 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c  YNCED || MEMDB |
318c0 7c 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  | !pPager->dbMod
318d0 69 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ified );.  rc = 
318e0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
318f0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
31900 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
31910 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ;.  return pager
31920 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
31930 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  c);.}../*.** Rol
31940 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
31950 73 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  s. The database 
31960 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
31970 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
31980 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
31990 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77  tion performs tw
319a0 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20  o tasks:.**.**  
319b0 20 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63   1) It rolls bac
319c0 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
319d0 6c 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c  le, restoring al
319e0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
319f0 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d  and .**      in-
31a00 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
31a10 65 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  es to the state 
31a20 74 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65  they were in whe
31a30 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
31a40 6e 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70  n.**      was op
31a50 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32  ened, and.**   2
31a60 29 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74  ) It finalizes t
31a70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
31a80 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
31a90 6f 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a  ot used for hot.
31aa0 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
31ab0 20 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e   at any point in
31ac0 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a   the future..**.
31ad0 2a 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  ** subject to th
31ae0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c  e following qual
31af0 69 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a  ifications:.**.*
31b00 2a 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  * * If the journ
31b10 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79  al file is not y
31b20 65 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  et open when thi
31b30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
31b40 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20  lled,.**   then 
31b50 6f 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66  only (2) is perf
31b60 6f 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63  ormed. In this c
31b70 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
31b80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
31b90 20 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a    to roll back..
31ba0 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e  **.** * If in an
31bb0 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
31bc0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
31bd0 55 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28  ULL, then task (
31be0 31 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66  1) is .**   perf
31bf0 6f 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73  ormed. If succes
31c00 73 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20  sful, task (2). 
31c10 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
31c20 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f  e outcome.**   o
31c30 66 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72  f either, the er
31c40 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
31c50 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
31c60 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a   to the caller.*
31c70 2a 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72  *   (i.e. either
31c80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
31c90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29   SQLITE_CORRUPT)
31ca0 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65  ..**.** * If the
31cb0 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
31cc0 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
31cd0 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  e, then attempt 
31ce0 28 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20  (1). Whether.** 
31cf0 20 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20    or not (1) is 
31d00 73 75 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f  succussful, also
31d10 20 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66   attempt (2). If
31d20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
31d30 75 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  urn.**   SQLITE_
31d40 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65  OK. Otherwise, e
31d50 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
31d60 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tate and return 
31d70 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20  the first .**   
31d80 65 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75  error code encou
31d90 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20  ntered. .**.**  
31da0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
31db0 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
31dc0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
31dd0 73 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  se was written t
31de0 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73  o. .**   So is s
31df0 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  afe to finalize 
31e00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31e10 20 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61   even if the pla
31e20 79 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65  yback .**   (ope
31e30 72 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64  ration 1) failed
31e40 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61  . However the pa
31e50 67 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74  ger must enter t
31e60 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a  he error state.*
31e70 2a 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65  *   as the conte
31e80 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
31e90 6d 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e  mory cache are n
31ea0 6f 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a  ow suspect..**.*
31eb0 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  * * Finally, if 
31ec0 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  in PAGER_EXCLUSI
31ed0 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61  VE state, then a
31ee0 74 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79  ttempt (1). Only
31ef0 0a 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32  .**   attempt (2
31f00 29 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63  ) if (1) is succ
31f10 65 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53  essful. Return S
31f20 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
31f30 65 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68  essful,.**   oth
31f40 65 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65  erwise enter the
31f50 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
31f60 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
31f70 72 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20  r code from the 
31f80 0a 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70  .**   failing op
31f90 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  eration..**.**  
31fa0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
31fb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31fc0 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72  may have been wr
31fd0 69 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20  itten to. So if 
31fe0 74 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63  the.**   playbac
31ff0 6b 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20  k operation did 
32000 6e 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77  not succeed it w
32010 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65  ould not be safe
32020 20 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20   to finalize.** 
32030 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
32040 6c 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20  le. It needs to 
32050 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
32060 69 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68  ile-system so th
32070 61 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68  at.**   some oth
32080 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75  er process can u
32090 73 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  se it to restore
320a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74   the database st
320b0 61 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74  ate (by.**   hot
320c0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
320d0 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  k)..*/.int sqlit
320e0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
320f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32100 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
32110 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
32120 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
32130 20 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52   code */.  PAGER
32140 54 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b  TRACE(("ROLLBACK
32150 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
32160 70 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28  pPager)));.  if(
32170 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
32180 67 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ger) ){.    int 
32190 72 63 32 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  rc2;..    rc = s
321a0 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
321b0 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 53 41 56  oint(pPager, SAV
321c0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
321d0 20 2d 31 29 3b 0a 20 20 20 20 72 63 32 20 3d 20   -1);.    rc2 = 
321e0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
321f0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
32200 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
32210 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
32220 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
32230 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c2;.    rc = pag
32240 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
32250 20 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66   rc);.  }else if
32260 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  ( !pPager->dbMod
32270 69 66 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e  ified || !isOpen
32280 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
32290 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
322a0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
322b0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
322c0 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65  setMaster);.  }e
322d0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
322e0 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
322f0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
32300 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_FULL ){.    i
32310 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
32320 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
32330 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
32340 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
32350 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
32360 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
32370 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
32380 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
32390 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
323a0 52 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e  RVED ){.      in
323b0 74 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20  t rc2;.      rc 
323c0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
323d0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
323e0 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65     rc2 = pager_e
323f0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
32400 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
32410 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  etMaster);.     
32420 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32430 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
32440 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a   = rc2;.      }.
32450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32460 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
32470 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
32480 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
32490 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
324a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
324b0 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  lid = 0;.    }..
324c0 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
324d0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
324e0 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20   a ROLLBACK, we 
324f0 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72  can no longer tr
32500 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ust the pager.  
32510 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
32520 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
32530 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
32540 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
32550 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69  or .    ** persi
32560 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  stent..    */.  
32570 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
32580 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
32590 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
325a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
325b0 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
325c0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
325d0 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
325e0 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
325f0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
32600 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
32610 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20  writable..*/.u8 
32620 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
32630 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
32640 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
32650 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
32660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
32670 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
32680 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
32690 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  e pager..*/.int 
326a0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
326b0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
326c0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
326d0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
326e0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
326f0 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  che);.}../*.** R
32700 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 78  eturn the approx
32710 69 6d 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  imate number of 
32720 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
32730 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65  currently.** use
32740 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61  d by the pager a
32750 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65  nd its associate
32760 64 20 63 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20  d cache..*/.int 
32770 73 71 6c 69 74 65 33 50 61 67 65 72 4d 65 6d 55  sqlite3PagerMemU
32780 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
32790 72 29 7b 0a 20 20 69 6e 74 20 70 65 72 50 61 67  r){.  int perPag
327a0 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
327b0 70 61 67 65 53 69 7a 65 20 2b 20 70 50 61 67 65  pageSize + pPage
327c0 72 2d 3e 6e 45 78 74 72 61 20 2b 20 32 30 3b 0a  r->nExtra + 20;.
327d0 20 20 72 65 74 75 72 6e 20 70 65 72 50 61 67 65    return perPage
327e0 53 69 7a 65 2a 73 71 6c 69 74 65 33 50 63 61 63  Size*sqlite3Pcac
327f0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
32800 65 72 2d 3e 70 50 43 61 63 68 65 29 0a 20 20 20  er->pPCache).   
32810 20 20 20 20 20 20 20 20 2b 20 73 71 6c 69 74 65          + sqlite
32820 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 50 61 67  3MallocSize(pPag
32830 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
32840 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
32850 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
32860 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
32870 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
32880 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
32890 6f 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61  ount(DbPage *pPa
328a0 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ge){.  return sq
328b0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
328c0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a  efcount(pPage);.
328d0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
328e0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
328f0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
32900 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
32910 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
32920 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50  */.int *sqlite3P
32930 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20  agerStats(Pager 
32940 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
32950 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
32960 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[0] = sqlite3Pc
32970 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
32980 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
32990 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[1] = sqlite3P
329a0 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
329b0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
329c0 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65  .  a[2] = sqlite
329d0 33 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73  3PcacheGetCaches
329e0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
329f0 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  che);.  a[3] = p
32a00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
32a10 69 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65  id ? (int) pPage
32a20 72 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a  r->dbSize : -1;.
32a30 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
32a40 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
32a50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
32a60 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
32a70 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
32a80 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
32a90 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a  .  a[8] = 0;  /*
32aa0 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67   Used to be pPag
32ab0 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61  er->nOvfl */.  a
32ac0 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
32ad0 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
32ae0 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
32af0 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e   return a;.}.#en
32b00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
32b10 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69  n true if this i
32b20 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
32b30 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
32b40 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62  ite3PagerIsMemdb
32b50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
32b60 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b  .  return MEMDB;
32b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
32b80 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61  that there are a
32b90 74 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69  t least nSavepoi
32ba0 6e 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70  nt savepoints op
32bb0 65 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  en. If there are
32bc0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65  .** currently le
32bd0 73 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69  ss than nSavepoi
32be0 6e 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f  nts open, then o
32bf0 70 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  pen one or more 
32c00 73 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  savepoints.** to
32c10 20 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66   make up the dif
32c20 66 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20  ference. If the 
32c30 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
32c40 69 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a  ints is already.
32c50 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76  ** equal to nSav
32c60 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69  epoint, then thi
32c70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
32c80 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
32c90 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
32ca0 69 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  ion fails, SQLIT
32cb0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
32cc0 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
32cd0 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
32ce0 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75  e opening the su
32cf0 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
32d00 74 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72  then an IO error
32d10 20 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75   code is.** retu
32d20 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
32d30 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
32d40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
32d50 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67  penSavepoint(Pag
32d60 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
32d70 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  nSavepoint){.  i
32d80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
32d90 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
32da0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
32db0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
32dc0 20 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67   nCurrent = pPag
32dd0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
32de0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
32df0 74 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  t number of save
32e00 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28  points */..  if(
32e10 20 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72   nSavepoint>nCur
32e20 72 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e  rent && pPager->
32e30 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
32e40 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
32e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
32e70 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
32e80 2f 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  /.    PagerSavep
32e90 6f 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20  oint *aNew;     
32ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32eb0 20 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65   New Pager.aSave
32ec0 70 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  point array */. 
32ed0 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
32ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
32f00 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  ze of database f
32f10 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d  ile */..    rc =
32f20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
32f30 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
32f40 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
32f50 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
32f60 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
32f70 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
32f80 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65  t array using re
32f90 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20  alloc(). Return 
32fa0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
32fb0 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63   ** if the alloc
32fc0 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68  ation fails. Oth
32fd0 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65  erwise, zero the
32fe0 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20   new portion in 
32ff0 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d  case a .    ** m
33000 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
33010 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c  curs while popul
33020 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20  ating it in the 
33030 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65  for(...) loop be
33040 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
33050 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76  aNew = (PagerSav
33060 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33  epoint *)sqlite3
33070 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
33080 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
33090 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  int, sizeof(Page
330a0 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76  rSavepoint)*nSav
330b0 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20  epoint.    );.  
330c0 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
330d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
330e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
330f0 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
33100 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28  [nCurrent], 0, (
33110 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72  nSavepoint-nCurr
33120 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61  ent) * sizeof(Pa
33130 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a  gerSavepoint));.
33140 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
33150 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20  epoint = aNew;. 
33160 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
33170 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69  point = nSavepoi
33180 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75  nt;..    /* Popu
33190 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61  late the PagerSa
331a0 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
331b0 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65  es just allocate
331c0 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  d. */.    for(ii
331d0 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53  =nCurrent; ii<nS
331e0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
331f0 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
33200 6e 4f 72 69 67 20 3d 20 6e 50 61 67 65 3b 0a 20  nOrig = nPage;. 
33210 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
33220 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
33230 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
33240 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ff>0 ){.        
33250 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74  aNew[ii].iOffset
33260 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
33270 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  alOff;.      }el
33280 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77  se{.        aNew
33290 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a  [ii].iOffset = J
332a0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
332b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
332c0 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53       aNew[ii].iS
332d0 75 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e  ubRec = pPager->
332e0 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61  nSubRec;.      a
332f0 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
33300 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  oint = sqlite3Bi
33310 74 76 65 63 43 72 65 61 74 65 28 6e 50 61 67 65  tvecCreate(nPage
33320 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e  );.      if( !aN
33330 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
33340 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  int ){.        r
33350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
33360 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
33370 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
33380 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
33390 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 46       aNew[ii].iF
333a0 72 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 57 61  rame = sqlite3Wa
333b0 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65  lSavepoint(pPage
333c0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20 20  r->pWal);.      
333d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
333e0 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
333f0 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 6e  rnal, if it is n
33400 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  ot already opene
33410 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f  d. */.    rc = o
33420 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
33430 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
33440 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
33450 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  int(pPager);.  }
33460 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
33470 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
33480 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
33490 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72  to rollback or r
334a0 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
334b0 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20  a savepoint..** 
334c0 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
334d0 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
334e0 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65  back need not be
334f0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
33500 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65 64 20 73  ly .** created s
33510 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
33520 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73 20  Parameter op is 
33530 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 53 41  always either SA
33540 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
33550 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
33560 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20  LEASE..** If it 
33570 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
33580 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c 65 61  EASE, then relea
33590 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74  se and destroy t
335a0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74  he savepoint wit
335b0 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61 76 65  h.** index iSave
335c0 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69 73 20  point. If it is 
335d0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
335e0 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63  CK, then rollbac
335f0 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a  k all changes.**
33600 20 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72   that have occur
33610 72 65 64 20 73 69 6e 63 65 20 74 68 65 20 73 70  red since the sp
33620 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e  ecified savepoin
33630 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
33640 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69  *.** The savepoi
33650 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f  nt to rollback o
33660 72 20 72 65 6c 65 61 73 65 20 69 73 20 69 64 65  r release is ide
33670 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
33680 65 74 65 72 20 0a 2a 2a 20 69 53 61 76 65 70 6f  eter .** iSavepo
33690 69 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  int. A value of 
336a0 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65 72 61  0 means to opera
336b0 74 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 6d  te on the outerm
336c0 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ost savepoint.**
336d0 20 28 74 68 65 20 66 69 72 73 74 20 63 72 65 61   (the first crea
336e0 74 65 64 29 2e 20 41 20 76 61 6c 75 65 20 6f 66  ted). A value of
336f0 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
33700 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70 65 72  nt-1) means oper
33710 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f  ate.** on the mo
33720 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
33730 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49  ted savepoint. I
33740 66 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f iSavepoint is 
33750 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20  greater than.** 
33760 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
33770 74 2d 31 29 2c 20 74 68 65 6e 20 74 68 69 73 20  t-1), then this 
33780 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
33790 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  -op..**.** If a 
337a0 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 69  negative value i
337b0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
337c0 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20   function, then 
337d0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74  the current.** t
337e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
337f0 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
33800 69 73 20 64 69 66 66 65 72 65 6e 74 20 74 6f 20  is different to 
33810 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
33820 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
33830 28 29 20 62 65 63 61 75 73 65 20 74 68 69 73 20  () because this 
33840 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
33850 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 74  t terminate.** t
33860 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
33870 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  r unlock the dat
33880 61 62 61 73 65 2c 20 69 74 20 6a 75 73 74 20 72  abase, it just r
33890 65 73 74 6f 72 65 73 20 74 68 65 20 0a 2a 2a 20  estores the .** 
338a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
338b0 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
338c0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e 20  original state. 
338d0 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20 63 61  .**.** In any ca
338e0 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  se, all savepoin
338f0 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ts with an index
33900 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 69 53   greater than iS
33910 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65  avepoint .** are
33920 20 64 65 73 74 72 6f 79 65 64 2e 20 49 66 20 74   destroyed. If t
33930 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65  his is a release
33940 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70 3d 3d   operation (op==
33950 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
33960 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61 76 65  E),.** then save
33970 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  point iSavepoint
33980 20 69 73 20 61 6c 73 6f 20 64 65 73 74 72 6f 79   is also destroy
33990 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
339a0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
339b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  rn SQLITE_NOMEM 
339c0 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  if a memory allo
339d0 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
339e0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
339f0 63 6f 64 65 20 69 66 20 61 6e 20 49 4f 20 65 72  code if an IO er
33a00 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
33a10 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
33a20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 20 49  .** savepoint. I
33a30 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63 63 75  f no errors occu
33a40 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
33a50 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e  returned..*/ .in
33a60 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  t sqlite3PagerSa
33a70 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
33a80 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69  Pager, int op, i
33a90 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
33aa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33ab0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
33ac0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
33ad0 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
33ae0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
33af0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
33b00 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f  avepoint>=0 || o
33b10 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
33b20 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  LBACK );..  if( 
33b30 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67 65  iSavepoint<pPage
33b40 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  r->nSavepoint ){
33b50 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
33b60 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
33b70 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
33b80 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20      int nNew;   
33b90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
33ba0 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 73 61   of remaining sa
33bb0 76 65 70 6f 69 6e 74 73 20 61 66 74 65 72 20 74  vepoints after t
33bc0 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20  his op. */..    
33bd0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
33be0 77 20 6d 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  w many savepoint
33bf0 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20  s will still be 
33c00 61 63 74 69 76 65 20 61 66 74 65 72 20 74 68 69  active after thi
33c10 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  s.    ** operati
33c20 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69 73 20 76  on. Store this v
33c30 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20 54 68  alue in nNew. Th
33c40 65 6e 20 66 72 65 65 20 72 65 73 6f 75 72 63 65  en free resource
33c50 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20  s associated .  
33c60 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 73 61    ** with any sa
33c70 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 61 72  vepoints that ar
33c80 65 20 64 65 73 74 72 6f 79 65 64 20 62 79 20 74  e destroyed by t
33c90 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
33ca0 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77 20 3d     */.    nNew =
33cb0 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20 28 28   iSavepoint + ((
33cc0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
33cd0 45 4c 45 41 53 45 20 29 20 3f 20 30 20 3a 20 31  ELEASE ) ? 0 : 1
33ce0 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e  );.    for(ii=nN
33cf0 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  ew; ii<pPager->n
33d00 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
33d10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
33d20 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
33d30 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
33d40 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
33d50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
33d60 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
33d70 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20  = nNew;..    /* 
33d80 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
33d90 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ease of the oute
33da0 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 2c  rmost savepoint,
33db0 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20 2a   truncate .    *
33dc0 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
33dd0 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  l to zero bytes 
33de0 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 20 20  in size. */.    
33df0 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  if( op==SAVEPOIN
33e00 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20  T_RELEASE ){.   
33e10 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26     if( nNew==0 &
33e20 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
33e30 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  >sjfd) ){.      
33e40 20 20 2f 2a 20 4f 6e 6c 79 20 74 72 75 6e 63 61    /* Only trunca
33e50 74 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 69  te if it is an i
33e60 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
33e70 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rnal. */.       
33e80 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
33e90 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
33ea0 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  >sjfd) ){.      
33eb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33ec0 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
33ed0 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20  r->sjfd, 0);.   
33ee0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
33ef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
33f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33f10 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
33f20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 0;.      }. 
33f30 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 6c 73 65     }.    /* Else
33f40 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
33f50 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70  ack operation, p
33f60 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70 65 63  layback the spec
33f70 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  ified savepoint.
33f80 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
33f90 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 2c 20  is a temp-file, 
33fa0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
33fb0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
33fc0 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a 2a 20  file has.    ** 
33fd0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
33fe0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
33ff0 65 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  e there have bee
34000 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 0a  n no changes to.
34010 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
34020 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74 68 65  ase file, so the
34030 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74   playback operat
34040 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69 70 70  ion can be skipp
34050 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65  ed..    */.    e
34060 6c 73 65 20 69 66 28 20 70 61 67 65 72 55 73 65  lse if( pagerUse
34070 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 69  Wal(pPager) || i
34080 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
34090 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  d) ){.      Page
340a0 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
340b0 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d  epoint = (nNew==
340c0 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53  0)?0:&pPager->aS
340d0 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d  avepoint[nNew-1]
340e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
340f0 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
34100 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76  int(pPager, pSav
34110 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61  epoint);.      a
34120 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45  ssert(rc!=SQLITE
34130 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _DONE);.    }.  
34140 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
34150 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
34160 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
34170 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
34180 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
34190 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
341a0 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
341b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
341c0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
341d0 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
341e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46  ** Return the VF
341f0 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  S structure for 
34200 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f  the pager..*/.co
34210 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20  nst sqlite3_vfs 
34220 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73  *sqlite3PagerVfs
34230 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
34240 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
34250 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pVfs;.}../*.**
34260 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
34270 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
34280 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
34290 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
342a0 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
342b0 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e  s might return N
342c0 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20  ULL if the file 
342d0 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62  has.** not yet b
342e0 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  een opened..*/.s
342f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c  qlite3_file *sql
34300 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61  ite3PagerFile(Pa
34310 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
34320 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
34330 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
34340 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
34350 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
34360 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
34370 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
34380 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
34390 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
343a0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
343b0 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
343c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
343d0 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
343e0 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
343f0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
34400 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
34410 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
34420 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
34430 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
34440 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
34450 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
34460 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
34470 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Sync;.}..#ifdef 
34480 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
34490 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 72 65  ./*.** Set or re
344a0 74 72 69 65 76 65 20 74 68 65 20 63 6f 64 65 63  trieve the codec
344b0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
344c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
344d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f  qlite3PagerSetCo
344e0 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
344f0 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a  ager,.  void *(*
34500 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
34510 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
34520 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69   void (*xCodecSi
34530 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e  zeChng)(void*,in
34540 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28  t,int),.  void (
34550 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
34560 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  d*),.  void *pCo
34570 64 65 63 0a 29 7b 0a 20 20 69 66 28 20 70 50 61  dec.){.  if( pPa
34580 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
34590 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ) pPager->xCodec
345a0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f  Free(pPager->pCo
345b0 64 65 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dec);.  pPager->
345c0 78 43 6f 64 65 63 20 3d 20 70 50 61 67 65 72 2d  xCodec = pPager-
345d0 3e 6d 65 6d 44 62 20 3f 20 30 20 3a 20 78 43 6f  >memDb ? 0 : xCo
345e0 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78  dec;.  pPager->x
345f0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 3d 20  CodecSizeChng = 
34600 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a  xCodecSizeChng;.
34610 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
34620 46 72 65 65 20 3d 20 78 43 6f 64 65 63 46 72 65  Free = xCodecFre
34630 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  e;.  pPager->pCo
34640 64 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20  dec = pCodec;.  
34650 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
34660 70 50 61 67 65 72 29 3b 0a 7d 0a 73 74 61 74 69  pPager);.}.stati
34670 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  c void *sqlite3P
34680 61 67 65 72 47 65 74 43 6f 64 65 63 28 50 61 67  agerGetCodec(Pag
34690 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
346a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 43  eturn pPager->pC
346b0 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  odec;.}.#endif..
346c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
346d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
346e0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
346f0 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69  ge pPg to locati
34700 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
34710 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ile..**.** There
34720 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
34730 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
34740 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
34750 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f  cated at.** pgno
34760 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20   (which we call 
34770 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74  pPgOld) though t
34780 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  hat page is allo
34790 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20  wed to be.** in 
347a0 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70  cache.  If the p
347b0 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
347c0 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69  ocated at pgno i
347d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
347e0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
347f0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20   journal, it is 
34800 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79  not put there by
34810 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
34820 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
34830 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
34840 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e  Pg remain valid.
34850 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a   Updating any.**
34860 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
34870 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28  iated with pPg (
34880 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
34890 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
348a0 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
348b0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
348c0 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
348d0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
348e0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
348f0 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
34900 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
34910 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
34920 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
34930 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
34940 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
34950 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
34960 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
34970 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
34980 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
34990 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
349a0 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
349b0 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
349c0 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
349d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
349e0 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a  s active)..**.**
349f0 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20 61   If the fourth a
34a00 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69  rgument, isCommi
34a10 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t, is non-zero, 
34a20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69  then this page i
34a30 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64  s being.** moved
34a40 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64 61   as part of a da
34a50 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a  tabase reorganiz
34a60 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72  ation just befor
34a70 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
34a80 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  n .** is being c
34a90 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69  ommitted. In thi
34aa0 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 67 75  s case, it is gu
34ab0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
34ac0 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
34ad0 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20 74  .** pPg refers t
34ae0 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  o will not be wr
34af0 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77  itten to again w
34b00 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
34b10 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  action..**.** Th
34b20 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
34b30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
34b40 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
34b50 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
34b60 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f  ror.** occurs. O
34b70 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 65 74  therwise, it ret
34b80 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
34b90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
34ba0 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
34bb0 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
34bc0 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
34bd0 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29  o, int isCommit)
34be0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  {.  PgHdr *pPgOl
34bf0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
34c00 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69   /* The page bei
34c10 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
34c20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  */.  Pgno needSy
34c30 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20  ncPgno = 0;     
34c40 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f    /* Old value o
34c50 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20  f pPg->pgno, if 
34c60 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
34c70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
34c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
34ca0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67  e */.  Pgno orig
34cb0 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
34cc0 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69      /* The origi
34cd0 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
34ce0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
34cf0 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
34d00 2f 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 62  /* In order to b
34d10 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
34d20 63 6b 2c 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ck, an in-memory
34d30 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 6a   database must j
34d40 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 74 68 65 20  ournal.  ** the 
34d50 70 61 67 65 20 77 65 20 61 72 65 20 6d 6f 76 69  page we are movi
34d60 6e 67 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20  ng from..  */.  
34d70 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
34d80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34d90 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
34da0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
34db0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
34dc0 49 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  If the page bein
34dd0 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74 79  g moved is dirty
34de0 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65 65   and has not bee
34df0 6e 20 73 61 76 65 64 20 62 79 20 74 68 65 20 6c  n saved by the l
34e00 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65 70  atest.  ** savep
34e10 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65 20  oint, then save 
34e20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
34e30 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
34e40 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20   into the .  ** 
34e50 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e  sub-journal now.
34e60 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
34e70 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
34e80 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72  following scenar
34e90 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  io:.  **.  **   
34ea0 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20  BEGIN;.  **     
34eb0 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 2c  <journal page X,
34ec0 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74 20   then modify it 
34ed0 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20  in memory>.  ** 
34ee0 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e      SAVEPOINT on
34ef0 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d  e;.  **       <M
34f00 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c 6f  ove page X to lo
34f10 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20  cation Y>.  **  
34f20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
34f30 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ne;.  **.  ** If
34f40 20 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74   page X were not
34f50 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
34f60 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65  sub-journal here
34f70 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20  , it would not. 
34f80 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20   ** be possible 
34f90 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20 63  to restore its c
34fa0 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65  ontents when the
34fb0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e   "ROLLBACK TO on
34fc0 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  e".  ** statemen
34fd0 74 20 77 65 72 65 20 69 73 20 70 72 6f 63 65 73  t were is proces
34fe0 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73  sed..  **.  ** s
34ff0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29 20  ubjournalPage() 
35000 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f  may need to allo
35010 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 73 74  cate space to st
35020 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
35030 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d  to.  ** one or m
35040 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62 69  ore savepoint bi
35050 74 76 65 63 73 2e 20 54 68 69 73 20 69 73 20 74  tvecs. This is t
35060 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20 66  he reason this f
35070 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79  unction.  ** may
35080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
35090 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  OMEM..  */.  if(
350a0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
350b0 52 5f 44 49 52 54 59 0a 20 20 20 26 26 20 73 75  R_DIRTY.   && su
350c0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
350d0 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45  Pg).   && SQLITE
350e0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f  _OK!=(rc = subjo
350f0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29 0a  urnalPage(pPg)).
35100 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
35110 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
35120 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20  TRACE(("MOVE %d 
35130 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
35140 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
35150 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
35160 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
35170 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66  g->pgno, (pPg->f
35180 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
35190 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29  SYNC)?1:0, pgno)
351a0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d  );.  IOTRACE(("M
351b0 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c  OVE %p %d %d\n",
351c0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
351d0 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a  no, pgno))..  /*
351e0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
351f0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
35200 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65  ()ed before page
35210 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20   pPg->pgno can. 
35220 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74   ** be written t
35230 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67  o, store pPg->pg
35240 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  no in local vari
35250 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  able needSyncPgn
35260 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  o..  **.  ** If 
35270 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  the isCommit fla
35280 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20  g is set, there 
35290 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
352a0 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a  member that.  **
352b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
352c0 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
352d0 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
352e0 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
352f0 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72   .  ** can be wr
35300 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
35310 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
35320 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
35330 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20   write to it..  
35340 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  */.  if( (pPg->f
35350 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
35360 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d  SYNC) && !isComm
35370 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  it ){.    needSy
35380 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
35390 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
353a0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
353b0 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e  g) || pPg->pgno>
353c0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
353d0 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
353e0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
353f0 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20  DR_DIRTY );.    
35400 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35410 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
35420 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
35430 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
35440 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
35450 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
35460 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
35470 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
35480 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72  so, if the PgHdr
35490 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65  .needSync was se
354a0 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  t for .  ** page
354b0 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65   pgno before the
354c0 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f   'move' operatio
354d0 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  n, it needs to b
354e0 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a  e retained .  **
354f0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f   for the page mo
35500 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a  ved there..  */.
35510 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
35520 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  ~PGHDR_NEED_SYNC
35530 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  ;.  pPgOld = pag
35540 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
35550 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
35560 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50  t( !pPgOld || pP
35570 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  gOld->nRef==1 );
35580 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
35590 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
355a0 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67  |= (pPgOld->flag
355b0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
355c0 43 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  C);.    if( MEMD
355d0 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  B ){.      /* Do
355e0 20 6e 6f 74 20 64 69 73 63 61 72 64 20 70 61 67   not discard pag
355f0 65 73 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65  es from an in-me
35600 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 69  mory database si
35610 6e 63 65 20 77 65 20 6d 69 67 68 74 0a 20 20 20  nce we might.   
35620 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 72 6f     ** need to ro
35630 6c 6c 62 61 63 6b 20 6c 61 74 65 72 2e 20 20 4a  llback later.  J
35640 75 73 74 20 6d 6f 76 65 20 74 68 65 20 70 61 67  ust move the pag
35650 65 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79  e out of the way
35660 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
35670 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
35680 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20  eValid );.      
35690 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76  sqlite3PcacheMov
356a0 65 28 70 50 67 4f 6c 64 2c 20 70 50 61 67 65 72  e(pPgOld, pPager
356b0 2d 3e 64 62 53 69 7a 65 2b 31 29 3b 0a 20 20 20  ->dbSize+1);.   
356c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
356d0 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
356e0 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  pPgOld);.    }. 
356f0 20 7d 0a 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d   }..  origPgno =
35700 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71   pPg->pgno;.  sq
35710 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28  lite3PcacheMove(
35720 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71  pPg, pgno);.  sq
35730 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
35740 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
35750 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
35760 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
35770 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
35780 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
35790 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
357a0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
357b0 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
357c0 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
357d0 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
357e0 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
357f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
35800 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
35810 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
35820 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
35830 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
35840 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
35850 65 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f  e .    ** "is jo
35860 75 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20  urnaled" bitvec 
35870 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73 65  flag has been se
35880 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f  t. This needs to
35890 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a   be remedied by.
358a0 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74      ** loading t
358b0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
358c0 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
358d0 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48   setting the PgH
358e0 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  dr.needSync .   
358f0 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a   ** flag..    **
35900 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61  .    ** If the a
35910 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74  ttempt to load t
35920 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
35930 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c   page-cache fail
35940 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74  s, (due.    ** t
35950 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  o a malloc() or 
35960 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65  IO failure), cle
35970 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68  ar the bit in th
35980 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20  e pInJournal[]. 
35990 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68     ** array. Oth
359a0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70  erwise, if the p
359b0 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  age is loaded an
359c0 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20  d written again 
359d0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74  in.    ** this t
359e0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
359f0 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ay be written to
35a00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35a10 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  le before.    **
35a20 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e   it is synced in
35a30 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
35a40 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69  ile. This way, i
35a50 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a  t may end up in.
35a60 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
35a70 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62  al file twice, b
35a80 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ut that is not a
35a90 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a   problem..    **
35aa0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69  .    ** The sqli
35ab0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61  te3PagerGet() ca
35ac0 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
35ad0 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
35ae0 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
35af0 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
35b00 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
35b10 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
35b20 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
35b30 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  dr;.    assert( 
35b40 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
35b50 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
35b60 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
35b70 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  ger, needSyncPgn
35b80 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  o, &pPgHdr);.   
35b90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35ba0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
35bb0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50  needSyncPgno<=pP
35bc0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
35bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
35be0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  rt( pPager->pTmp
35bf0 53 70 61 63 65 21 3d 30 20 29 3b 0a 20 20 20 20  Space!=0 );.    
35c00 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
35c10 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  cClear(pPager->p
35c20 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53  InJournal, needS
35c30 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d  yncPgno, pPager-
35c40 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
35c50 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
35c60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
35c70 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
35c80 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74   = 1;.    assert
35c90 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
35ca0 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b  ==0 && !MEMDB );
35cb0 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61  .    pPgHdr->fla
35cc0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
35cd0 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74  _SYNC;.    sqlit
35ce0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
35cf0 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73  y(pPgHdr);.    s
35d00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35d10 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20  (pPgHdr);.  }.. 
35d20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20   /*.  ** For an 
35d30 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
35d40 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  se, make sure th
35d50 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
35d60 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74  continues.  ** t
35d70 6f 20 65 78 69 73 74 2c 20 69 6e 20 63 61 73 65  o exist, in case
35d80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
35d90 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62   needs to roll b
35da0 61 63 6b 2e 20 20 55 73 65 20 70 50 67 4f 6c 64  ack.  Use pPgOld
35db0 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 6f 72 69  .  ** as the ori
35dc0 67 69 6e 61 6c 20 70 61 67 65 20 73 69 6e 63 65  ginal page since
35dd0 20 69 74 20 68 61 73 20 61 6c 72 65 61 64 79 20   it has already 
35de0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  been allocated..
35df0 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42    */.  if( MEMDB
35e00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
35e10 63 61 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64  cacheMove(pPgOld
35e20 2c 20 6f 72 69 67 50 67 6e 6f 29 3b 0a 20 20 20  , origPgno);.   
35e30 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35e40 65 66 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a  ef(pPgOld);.  }.
35e50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35e60 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
35e70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
35e80 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74  inter to the dat
35e90 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  a for the specif
35ea0 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
35eb0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
35ec0 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70  etData(DbPage *p
35ed0 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg){.  assert( p
35ee0 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50  Pg->nRef>0 || pP
35ef0 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  g->pPager->memDb
35f00 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67   );.  return pPg
35f10 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pData;.}../*.*
35f20 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
35f30 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
35f40 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
35f50 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
35f60 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
35f70 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
35f80 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
35f90 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
35fa0 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
35fb0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
35fc0 70 50 67 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a  pPg->pExtra;.}..
35fd0 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
35fe0 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66  e locking-mode f
35ff0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
36000 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
36010 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66  ust be one.** of
36020 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
36030 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f  DE_QUERY, PAGER_
36040 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
36050 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f  AL or .** PAGER_
36060 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
36070 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61  USIVE. If the pa
36080 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
36090 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74  QUERY, then.** t
360a0 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
360b0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
360c0 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
360d0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
360e0 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  d value is eithe
360f0 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  r PAGER_LOCKINGM
36100 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a  ODE_NORMAL or.**
36110 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
36120 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e  DE_EXCLUSIVE, in
36130 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72  dicating the cur
36140 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
36150 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69  pdated).** locki
36160 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  ng-mode..*/.int 
36170 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
36180 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  ingMode(Pager *p
36190 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
361a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
361b0 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
361c0 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  GMODE_QUERY.    
361d0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
361e0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
361f0 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  ODE_NORMAL.     
36200 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
36210 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
36220 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
36230 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
36240 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
36250 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Y<0 );.  assert(
36260 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
36270 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20  DE_NORMAL>=0 && 
36280 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
36290 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29  E_EXCLUSIVE>=0 )
362a0 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
362b0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
362c0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
362d0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
362e0 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a  de = (u8)eMode;.
362f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
36300 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
36310 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  iveMode;.}../*.*
36320 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f  * Get/set the jo
36330 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74  urnal-mode for t
36340 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
36350 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
36360 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  be one of:.**.**
36370 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
36380 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20  LMODE_QUERY.**  
36390 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
363a0 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20  ODE_DELETE.**   
363b0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
363c0 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20  DE_TRUNCATE.**  
363d0 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
363e0 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20  ODE_PERSIST.**  
363f0 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
36400 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41  ODE_OFF.**    PA
36410 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
36420 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 50 41 47  MEMORY.**    PAG
36430 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
36440 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  AL.**.** If the 
36450 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
36460 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68   _QUERY, then th
36470 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69  e journal_mode i
36480 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20  s set to the.** 
36490 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 20  value specified 
364a0 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69 73  if the change is
364b0 20 61 6c 6c 6f 77 65 64 2e 20 54 68 65 20 63 68   allowed. The ch
364c0 61 6e 67 65 20 6d 61 79 20 62 65 20 64 69 73 61  ange may be disa
364d0 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68  llowed.** for th
364e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73  e following reas
364f0 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ons:.**.**   *  
36500 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  An in-memory dat
36510 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68  abase can only h
36520 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f  ave its journal_
36530 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46  mode set to _OFF
36540 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d  .**      or _MEM
36550 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ORY..**.**   *  
36560 54 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  The journal mode
36570 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e   may not be chan
36580 67 65 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e  ged while a tran
36590 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
365a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  e..**.** The ret
365b0 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74  urned indicate t
365c0 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
365d0 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f  ibly updated) jo
365e0 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
365f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  nt sqlite3PagerJ
36600 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72  ournalMode(Pager
36610 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
36620 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
36630 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
36640 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20  RNALMODE_QUERY. 
36650 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
36660 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
36670 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20  ALMODE_DELETE.  
36680 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
36690 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
366a0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
366b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
366c0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
366d0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
366e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
366f0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
36700 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
36710 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
36720 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
36730 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20  ODE_WAL .       
36740 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
36750 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
36760 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73  _MEMORY );.  ass
36770 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e  ert( PAGER_JOURN
36780 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  ALMODE_QUERY<0 )
36790 3b 0a 0a 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  ;..  if( eMode==
367a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
367b0 45 5f 57 41 4c 20 0a 20 20 20 26 26 20 70 50 61  E_WAL .   && pPa
367c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
367d0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
367e0 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 29 7b 0a  ODE_DELETE.  ){.
367f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
36800 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
36810 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 3b  JOURNALMODE_WAL;
36820 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f  .  }else if( eMo
36830 64 65 3e 3d 30 0a 20 20 20 26 26 20 28 70 50 61  de>=0.   && (pPa
36840 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
36850 20 7c 7c 20 65 4d 6f 64 65 21 3d 50 41 47 45 52   || eMode!=PAGER
36860 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
36870 29 0a 20 20 20 26 26 20 28 21 4d 45 4d 44 42 20  ).   && (!MEMDB 
36880 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
36890 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
368a0 52 59 7c 7c 65 4d 6f 64 65 3d 3d 50 41 47 45 52  RY||eMode==PAGER
368b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
368c0 29 0a 20 20 20 26 26 20 21 70 50 61 67 65 72 2d  ).   && !pPager-
368d0 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20 20 20 26  >dbModified.   &
368e0 26 20 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65  & (!isOpen(pPage
368f0 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70 50  r->jfd) || 0==pP
36900 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
36910 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ).  ){.    if( i
36920 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
36930 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  d) ){.      sqli
36940 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
36950 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 20  r->jfd);.    }. 
36960 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
36970 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
36980 55 4e 43 41 54 45 20 26 20 31 29 3d 3d 31 20 29  UNCATE & 1)==1 )
36990 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
369a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
369b0 5f 50 45 52 53 49 53 54 20 26 20 31 29 3d 3d 31  _PERSIST & 1)==1
369c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
369d0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
369e0 44 45 5f 44 45 4c 45 54 45 20 26 20 31 29 3d 3d  DE_DELETE & 1)==
369f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
36a00 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
36a10 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 20 31 29 3d  ODE_MEMORY & 1)=
36a20 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
36a30 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
36a40 4d 4f 44 45 5f 4f 46 46 20 26 20 31 29 3d 3d 30  MODE_OFF & 1)==0
36a50 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61   );.    if( (pPa
36a60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
36a70 20 26 20 31 29 3d 3d 31 20 26 26 20 28 65 4d 6f   & 1)==1 && (eMo
36a80 64 65 20 26 20 31 29 3d 3d 30 0a 20 20 20 20 20  de & 1)==0.     
36a90 20 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e      && !pPager->
36aa0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
36ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
36ac0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
36ad0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
36ae0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  urnal, 0);.    }
36af0 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ..    pPager->jo
36b00 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29  urnalMode = (u8)
36b10 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
36b20 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
36b30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a  >journalMode;.}.
36b40 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
36b50 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73  he size-limit us
36b60 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ed for persisten
36b70 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  t journal files.
36b80 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74  .**.** Setting t
36b90 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f  he size limit to
36ba0 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d   -1 means no lim
36bb0 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a  it is enforced..
36bc0 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f  ** An attempt to
36bd0 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61   set a limit sma
36be0 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20  ller than -1 is 
36bf0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20  a no-op..*/.i64 
36c00 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
36c10 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67  nalSizeLimit(Pag
36c20 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20  er *pPager, i64 
36c30 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69  iLimit){.  if( i
36c40 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20  Limit>=-1 ){.   
36c50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36c60 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  SizeLimit = iLim
36c70 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
36c80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36c90 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a  SizeLimit;.}../*
36ca0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
36cb0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67  nter to the pPag
36cc0 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69  er->pBackup vari
36cd0 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70  able. The backup
36ce0 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61   module.** in ba
36cf0 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73  ckup.c maintains
36d00 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
36d10 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54  this variable. T
36d20 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73  his module.** us
36d30 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61  es it opaquely a
36d40 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
36d50 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
36d60 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73  start() and.** s
36d70 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
36d80 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71  te() only..*/.sq
36d90 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73  lite3_backup **s
36da0 71 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75  qlite3PagerBacku
36db0 70 50 74 72 28 50 61 67 65 72 20 2a 70 50 61 67  pPtr(Pager *pPag
36dc0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70  er){.  return &p
36dd0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a  Pager->pBackup;.
36de0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
36df0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
36e00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
36e10 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
36e20 65 20 75 73 65 72 20 69 6e 76 6f 6b 65 73 20 22  e user invokes "
36e30 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e  PRAGMA checkpoin
36e40 74 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  t"..*/.int sqlit
36e50 65 33 50 61 67 65 72 43 68 65 63 6b 70 6f 69 6e  e3PagerCheckpoin
36e60 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
36e70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
36e80 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
36e90 61 67 65 72 2d 3e 70 57 61 6c 20 29 7b 0a 20 20  ager->pWal ){.  
36ea0 20 20 75 38 20 2a 7a 42 75 66 20 3d 20 28 75 38    u8 *zBuf = (u8
36eb0 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
36ec0 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  pace;.    rc = s
36ed0 71 6c 69 74 65 33 57 61 6c 43 68 65 63 6b 70 6f  qlite3WalCheckpo
36ee0 69 6e 74 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  int(pPager->pWal
36ef0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20  , pPager->fd, . 
36f00 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
36f10 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61  noSync ? 0 : pPa
36f20 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
36f30 2c 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ,.        pPager
36f40 2d 3e 70 61 67 65 53 69 7a 65 2c 20 7a 42 75 66  ->pageSize, zBuf
36f50 2c 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  , .        pPage
36f60 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 2c  r->xBusyHandler,
36f70 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
36f80 6e 64 6c 65 72 41 72 67 0a 20 20 20 20 29 3b 0a  ndlerArg.    );.
36f90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
36fa0 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .}..int sqlite3P
36fb0 61 67 65 72 57 61 6c 43 61 6c 6c 62 61 63 6b 28  agerWalCallback(
36fc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
36fd0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
36fe0 57 61 6c 43 61 6c 6c 62 61 63 6b 28 70 50 61 67  WalCallback(pPag
36ff0 65 72 2d 3e 70 57 61 6c 29 3b 0a 7d 0a 0a 2f 2a  er->pWal);.}../*
37000 0a 2a 2a 20 4f 70 65 6e 20 61 20 63 6f 6e 6e 65  .** Open a conne
37010 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 77 72 69  ction to the wri
37020 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 66 69 6c  te-ahead log fil
37030 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
37040 65 72 2e 20 49 66 0a 2a 2a 20 74 68 65 20 6c 6f  er. If.** the lo
37050 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  g connection is 
37060 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
37070 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
37080 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
37090 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 62 65  e caller must be
370a0 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45   holding a SHARE
370b0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
370c0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
370d0 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  all.** this func
370e0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
370f0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
37100 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
37110 69 6e 74 20 2a 70 69 73 4f 70 65 6e 29 7b 0a 20  int *pisOpen){. 
37120 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37130 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
37140 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
37150 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
37160 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
37170 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
37180 66 28 20 21 70 50 61 67 65 72 2d 3e 70 57 61 6c  f( !pPager->pWal
37190 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
371a0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
371b0 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  to the log file.
371c0 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
371d0 6f 6e 20 66 61 69 6c 73 2c 20 0a 20 20 20 20 2a  on fails, .    *
371e0 2a 20 28 65 2e 67 2e 20 64 75 65 20 74 6f 20 6d  * (e.g. due to m
371f0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 29  alloc() failure)
37200 2c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  , unlock the dat
37210 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a  abase file and .
37220 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e      ** return an
37230 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20   error code..   
37240 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
37250 69 74 65 33 57 61 6c 4f 70 65 6e 28 70 50 61 67  ite3WalOpen(pPag
37260 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
37270 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 70 50  ->zFilename, &pP
37280 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
37290 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
372a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
372b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
372c0 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
372d0 4f 44 45 5f 57 41 4c 3b 0a 20 20 20 20 7d 0a 20  ODE_WAL;.    }. 
372e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 73   }else{.    *pis
372f0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  Open = 1;.  }.. 
37300 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37310 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
37320 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
37330 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63  close the connec
37340 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20  tion to the log 
37350 66 69 6c 65 20 70 72 69 6f 72 0a 2a 2a 20 74 6f  file prior.** to
37360 20 73 77 69 74 63 68 69 6e 67 20 66 72 6f 6d 20   switching from 
37370 57 41 4c 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  WAL to rollback 
37380 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  mode..**.** Befo
37390 72 65 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 6c  re closing the l
373a0 6f 67 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  og file, this fu
373b0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
373c0 74 6f 20 74 61 6b 65 20 61 6e 20 0a 2a 2a 20 45  to take an .** E
373d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
373e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
373f0 6c 65 2e 20 49 66 20 74 68 69 73 20 63 61 6e 6e  le. If this cann
37400 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ot be obtained, 
37410 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 28 53 51 4c  an.** error (SQL
37420 49 54 45 5f 42 55 53 59 29 20 69 73 20 72 65 74  ITE_BUSY) is ret
37430 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  urned and the lo
37440 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  g connection is 
37450 6e 6f 74 20 63 6c 6f 73 65 64 2e 0a 2a 2a 20 49  not closed..** I
37460 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
37470 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
37480 20 69 73 20 6e 6f 74 20 72 65 6c 65 61 73 65 64   is not released
37490 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
374a0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
374b0 33 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 50  3PagerCloseWal(P
374c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
374d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
374e0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
374f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
37500 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
37510 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 3b 0a 0a 20  ALMODE_WAL );.. 
37520 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 67 20 66   /* If the log f
37530 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ile is not alrea
37540 64 79 20 6f 70 65 6e 2c 20 62 75 74 20 64 6f 65  dy open, but doe
37550 73 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 66  s exist in the f
37560 69 6c 65 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a  ile-system,.  **
37570 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
37580 62 65 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  be checkpointed 
37590 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65  before the conne
375a0 63 74 69 6f 6e 20 63 61 6e 20 73 77 69 74 63 68  ction can switch
375b0 20 74 6f 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   to.  ** rollbac
375c0 6b 20 6d 6f 64 65 2e 20 4f 70 65 6e 20 69 74 20  k mode. Open it 
375d0 6e 6f 77 20 73 6f 20 74 68 69 73 20 63 61 6e 20  now so this can 
375e0 68 61 70 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  happen..  */.  i
375f0 66 28 20 21 70 50 61 67 65 72 2d 3e 70 57 61 6c  f( !pPager->pWal
37600 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 67 65   ){.    int loge
37610 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20 72  xists = 0;.    r
37620 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
37630 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  k(pPager->fd, SQ
37640 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44  LITE_LOCK_SHARED
37650 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
37660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37670 20 20 72 63 20 3d 20 70 61 67 65 72 48 61 73 57    rc = pagerHasW
37680 41 4c 28 70 50 61 67 65 72 2c 20 26 6c 6f 67 65  AL(pPager, &loge
37690 78 69 73 74 73 29 3b 0a 20 20 20 20 7d 0a 20 20  xists);.    }.  
376a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
376b0 5f 4f 4b 20 26 26 20 6c 6f 67 65 78 69 73 74 73  _OK && logexists
376c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
376d0 71 6c 69 74 65 33 57 61 6c 4f 70 65 6e 28 70 50  qlite3WalOpen(pP
376e0 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
376f0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  er->zFilename, &
37700 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
37710 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20     }.  }.    .  
37720 2f 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 61 6e  /* Checkpoint an
37730 64 20 63 6c 6f 73 65 20 74 68 65 20 6c 6f 67 2e  d close the log.
37740 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c   Because an EXCL
37750 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65  USIVE lock is he
37760 6c 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 64  ld on.  ** the d
37770 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
37780 65 20 6c 6f 67 20 61 6e 64 20 6c 6f 67 2d 73 75  e log and log-su
37790 6d 6d 61 72 79 20 66 69 6c 65 73 20 77 69 6c 6c  mmary files will
377a0 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 2a   be deleted..  *
377b0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
377c0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
377d0 3e 70 57 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  >pWal ){.    rc 
377e0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
377f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
37800 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56  TE_LOCK_EXCLUSIV
37810 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  E);.    if( rc==
37820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37830 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
37840 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  alClose(pPager->
37850 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 66 64  pWal, pPager->fd
37860 2c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  ,.        (pPage
37870 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20  r->noSync ? 0 : 
37880 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
37890 67 73 29 2c 20 0a 20 20 20 20 20 20 20 20 70 50  gs), .        pP
378a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
378b0 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  (u8*)pPager->pTm
378c0 70 53 70 61 63 65 0a 20 20 20 20 20 20 29 3b 0a  pSpace.      );.
378d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 57        pPager->pW
378e0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  al = 0;.    }.  
378f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
37900 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20  .#endif..#endif 
37910 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
37920 49 53 4b 49 4f 20 2a 2f 0a                       ISKIO */.