/ Hex Artifact Content
Login

Artifact 39f61b5161191bae00bdef32aab84338d3ab9342:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2660: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
2670: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
2680: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
2690: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
26a0: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
26b0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
26c0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
26d0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
26e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
26f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
2700: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
2710: 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f 64  *   Pager.errCod
2720: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
2730: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
2740: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
2750: 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45 5f  .**   or SQLITE_
2760: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
2770: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
2780: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
2790: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
27a0: 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65    and is returne
27b0: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
27c0: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
27d0: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
27e0: 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  The.**   SQLITE_
27f0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
2800: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
2810: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
2820: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
2830: 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75 63  he.**   next suc
2840: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
2850: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
2860: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2870: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51 4c  . Also,.**   SQL
2880: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
2890: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
28a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
28b0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
28c0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50 49  ookup().**   API
28d0: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
28e0: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
28f0: 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64 62  sfully..**.** db
2900: 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69 7a  SizeValid, dbSiz
2910: 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20 64  e, dbOrigSize, d
2920: 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bFileSize.**.** 
2930: 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20 73    Managing the s
2940: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2950: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
2960: 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63 6f  s is a little co
2970: 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20 20  mplicated..**   
2980: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
2990: 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61 69  er.dbSize contai
29a0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29b0: 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20   pages that the 
29c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69 6d  database.**   im
29d0: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  age currently co
29e0: 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64  ntains. As the d
29f0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67 72  atabase image gr
2a00: 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74  ows or shrinks t
2a10: 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c  his.**   variabl
2a20: 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54 68  e is updated. Th
2a30: 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65 72  e variable Pager
2a40: 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74  .dbFileSize cont
2a50: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  ains the number.
2a60: 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69 6e  **   of pages in
2a70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a80: 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20  le. This may be 
2a90: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 50  different from P
2aa0: 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20 20  ager.dbSize.**  
2ab0: 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20 68   if some pages h
2ac0: 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ave been appende
2ad0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
2ae0: 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74 20  e image but not 
2af0: 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  yet written.**  
2b00: 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63 61   out from the ca
2b10: 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75 61  che to the actua
2b20: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  l file on disk. 
2b30: 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65 20  Or if the image 
2b40: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74 72  has been.**   tr
2b50: 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69 6e  uncated by an in
2b60: 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
2b70: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20   operation. The 
2b80: 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a 65  Pager.dbOrigSize
2b90: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 63   variable.**   c
2ba0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
2bb0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2bc0: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2bd0: 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
2be0: 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63 74  nt.**   transact
2bf0: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
2c00: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2c10: 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  all three of the
2c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73 0a  se variables is.
2c30: 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61 6e  **   only guaran
2c40: 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65  teed to be corre
2c50: 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61  ct if the boolea
2c60: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61  n Pager.dbSizeVa
2c70: 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lid is true..**.
2c80: 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65 72  **   TODO: Under
2c90: 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e 73   what conditions
2ca0: 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64 20   is dbSizeValid 
2cb0: 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a 2a  set? Cleared?.**
2cc0: 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  .** changeCountD
2cd0: 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  one.**.**   This
2ce0: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
2cf0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  e is used to mak
2d00: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
2d10: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
2d20: 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74 65  **   (the 4-byte
2d30: 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61 74   header field at
2d40: 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2d50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d60: 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20 6e  file) is .**   n
2d70: 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65 20  ot updated more 
2d80: 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65 73  often than neces
2d90: 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  sary. .**.**   I
2da0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
2db0: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   when the change
2dc0: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 69  -counter field i
2dd0: 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63 68  s updated, which
2de0: 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79 20   .**   can only 
2df0: 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78 63  happen if an exc
2e00: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
2e10: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2e20: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
2e30: 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73 65  t is cleared (se
2e40: 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65 6e  t to false) when
2e50: 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69 76  ever an exclusiv
2e60: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20 20  e lock is .**   
2e70: 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e 20  relinquished on 
2e80: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e90: 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 74  e. Each time a t
2ea0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2eb0: 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54 68  mmitted,.**   Th
2ec0: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
2ed0: 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65 63  e flag is inspec
2ee0: 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74 72  ted. If it is tr
2ef0: 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66 0a  ue, the work of.
2f00: 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74 68  **   updating th
2f10: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2f20: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20   is omitted for 
2f30: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2f40: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
2f50: 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20   This mechanism 
2f60: 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e 20  means that when 
2f70: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2f80: 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f 6e  sive mode, a con
2f90: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e 65  nection .**   ne
2fa0: 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20 74  ed only update t
2fb0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2fc0: 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65 20  r once, for the 
2fd0: 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69 6f  first transactio
2fe0: 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65 64  n.**   committed
2ff0: 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66 69  ..**.** dbModifi
3000: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ed.**.**   The d
3010: 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20 69  bModified flag i
3020: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 61  s set whenever a
3030: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
3040: 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20 20  s dirtied..**   
3050: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61 74  It is cleared at
3060: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
3070: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
3080: 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65 64  .**   It is used
3090: 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
30a0: 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65 6e   or otherwise en
30b0: 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ding a transacti
30c0: 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65 20  on. If.**   the 
30d0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
30e0: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c 65  is clear then le
30f0: 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20 62  ss work has to b
3100: 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f  e done..**.** jo
3110: 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a 0a  urnalStarted.**.
3120: 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20 69  **   This flag i
3130: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 74  s set whenever t
3140: 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  he the main jour
3150: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  nal is opened an
3160: 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69 7a  d.**   initializ
3170: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  ed.**.**   The p
3180: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
3190: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
31a0: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
31b0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
31c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
31d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
31e0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
31f0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
3200: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
3210: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
3220: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
3230: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
3240: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
3250: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
3260: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
3270: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
3280: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
3290: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
32a0: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
32b0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
32c0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
32d0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
32e0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
32f0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
3300: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
3310: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
3320: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
3330: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
3340: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
3350: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
3360: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
3370: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
3380: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
3390: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
33a0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
33b0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
33c0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
33d0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
33e0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
33f0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
3400: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
3410: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
3420: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
3430: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
3440: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
3450: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
3460: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
3470: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
3480: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
3490: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
34a0: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
34b0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
34c0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
34d0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
34e0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
34f0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
3500: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
3510: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
3520: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
3530: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
3540: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
3550: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
3560: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
3570: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
3580: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
3590: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
35a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
35b0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
35c0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
35d0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
35e0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c 20  .** doNotSpill, 
35f0: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a 2a  doNotSyncSpill.*
3600: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
3610: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
3620: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3630: 2e 20 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  .  The doNotSpil
3640: 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  l variable.**   
3650: 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
3660: 68 65 20 73 70 69 6c 6c 20 61 6e 64 20 64 6f 4e  he spill and doN
3670: 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 6e 68 69  otSyncSpill inhi
3680: 62 69 74 73 20 74 68 6f 73 65 20 73 70 69 6c 6c  bits those spill
3690: 73 20 74 68 61 74 0a 2a 2a 20 20 20 77 6f 75 6c  s that.**   woul
36a0: 64 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  d require a jour
36b0: 6e 61 6c 20 73 79 6e 63 2e 20 20 54 68 65 20 64  nal sync.  The d
36c0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73  oNotSyncSpill is
36d0: 20 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64   set and cleared
36e0: 20 0a 2a 2a 20 20 20 62 79 20 73 71 6c 69 74 65   .**   by sqlite
36f0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 6e  3PagerWrite() in
3700: 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e   order to preven
3710: 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  t a journal sync
3720: 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20   from happening 
3730: 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65 6e  .**   in between
3740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
3750: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
3760: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
3770: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 64 6f 4e 6f  .  The.**   doNo
3780: 74 53 70 69 6c 6c 20 76 61 6c 75 65 20 73 65 74  tSpill value set
3790: 20 74 6f 20 70 72 65 76 65 6e 74 20 70 61 67 65   to prevent page
37a0: 72 53 74 72 65 73 73 28 29 20 66 72 6f 6d 20 74  rStress() from t
37b0: 72 79 69 6e 67 20 74 6f 20 75 73 65 0a 2a 2a 20  rying to use.** 
37c0: 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 75    the journal du
37d0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
37e0: 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a  .**.** needSync.
37f0: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74  **.**   TODO: It
3800: 20 6d 69 67 68 74 20 62 65 20 65 61 73 69 65 72   might be easier
3810: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
3820: 69 61 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f  iable in writeJo
3830: 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20  urnalHdr().**   
3840: 61 6e 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a  and writeMasterJ
3850: 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43  ournal() only. C
3860: 68 61 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e  hange its meanin
3870: 67 20 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64  g to "unsynced d
3880: 61 74 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65  ata.**   has bee
3890: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
38a0: 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a   journal"..**.**
38b0: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
38c0: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
38d0: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
38e0: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
38f0: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
3900: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
3910: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
3920: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
3930: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
3940: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
3950: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
3960: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
3970: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
3980: 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72  er files..*/.str
3990: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71  uct Pager {.  sq
39a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
39b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20            /* OS 
39c0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65  functions to use
39d0: 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20   for IO */.  u8 
39e0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
3a00: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
3a10: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
3a20: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  SIVE */.  u8 jou
3a30: 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rnalMode;       
3a40: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74        /* On of t
3a50: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
3a60: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
3a70: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
3a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3a90: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
3aa0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
3ab0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
3ac0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
3ad0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
3ae0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
3af0: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
3b00: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b20: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
3b30: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
3b40: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
3b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b60: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
3b70: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
3b80: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
3b90: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
3ba0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
3bb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
3bc0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
3bd0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d  FULL */.  u8 tem
3be0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
3bf0: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
3c00: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
3c10: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
3c20: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
3c30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3c40: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
3c50: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3c60: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
3c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3c80: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
3c90: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
3ca0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
3cb0: 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20   block contains 
3cc0: 74 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62  those class memb
3cd0: 65 72 73 20 74 68 61 74 20 61 72 65 20 64 79 6e  ers that are dyn
3ce0: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f  amically.  ** mo
3cf0: 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f  dified during no
3d00: 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e  rmal operations.
3d10: 20 54 68 65 20 6f 74 68 65 72 20 76 61 72 69 61   The other varia
3d20: 62 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74 72  bles in this str
3d30: 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20  ucture.  ** are 
3d40: 65 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20  either constant 
3d50: 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c  throughout the l
3d60: 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70  ifetime of the p
3d70: 61 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20  ager, or else.  
3d80: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
3d90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70   configuration p
3da0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
3db0: 66 66 65 63 74 20 74 68 65 20 77 61 79 20 74 68  ffect the way th
3dc0: 65 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70  e pager .  ** op
3dd0: 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  erates..  **.  *
3de0: 2a 20 54 68 65 20 27 73 74 61 74 65 27 20 76 61  * The 'state' va
3df0: 72 69 61 62 6c 65 20 69 73 20 64 65 73 63 72 69  riable is descri
3e00: 62 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61  bed in more deta
3e10: 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  il along with th
3e20: 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69  e.  ** descripti
3e30: 6f 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ons of the value
3e40: 73 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20  s it may take - 
3e50: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63  PAGER_UNLOCK etc
3e60: 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20  . Many of the.  
3e70: 2a 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  ** other variabl
3e80: 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b  es in this block
3e90: 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20 69   are described i
3ea0: 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69  n the comment di
3eb0: 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f  rectly .  ** abo
3ec0: 76 65 20 74 68 69 73 20 63 6c 61 73 73 20 64 65  ve this class de
3ed0: 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  finition..  */. 
3ee0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f00: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53  PAGER_UNLOCK, _S
3f10: 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44  HARED, _RESERVED
3f20: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64  , etc. */.  u8 d
3f30: 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20  bModified;      
3f40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f50: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
3f60: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3f70: 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  Db */.  u8 needS
3f80: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3f90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
3fa0: 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65  n fsync() is nee
3fb0: 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  ded on the journ
3fc0: 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  al */.  u8 journ
3fd0: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3fe0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3ff0: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
4000: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
4010: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
4020: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
4030: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
4040: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
4050: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
4060: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
4070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4080: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
4090: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
40a0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
40b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
40c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
40d0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
40e0: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
40f0: 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  o */.  u8 doNotS
4100: 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20 20  yncSpill;       
4110: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20     /* Do not do 
4120: 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65 71  a spill that req
4130: 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63 20  uires jrnl sync 
4140: 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61  */.  u8 dbSizeVa
4150: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
4160: 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53   /* Set when dbS
4170: 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a  ize is correct *
4180: 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d  /.  u8 subjInMem
4190: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ory;            
41a0: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69  /* True to use i
41b0: 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
41c0: 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  rnals */.  Pgno 
41d0: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
41e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
41f0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
4200: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
4210: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
4220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
4230: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
4240: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
4250: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
4260: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
4270: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4280: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
4290: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
42a0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42c0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
42d0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
42e0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
4310: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
4320: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
4330: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
4340: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
4350: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
4360: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
4370: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
4380: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
4390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
43b0: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
43c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
43d0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
43e0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
43f0: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
4400: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
4410: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4420: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
4430: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
4440: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
4450: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
4460: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4470: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
4480: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
4490: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
44a0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
44b0: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
44c0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
44d0: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
44e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
44f0: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
4500: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4510: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
4520: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
4530: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
4540: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
4550: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
4560: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
4570: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
4580: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
4590: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  zeLimit;       /
45a0: 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  * Size limit for
45b0: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
45c0: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50  nal files */.  P
45d0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
45e0: 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72  Savepoint; /* Ar
45f0: 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61  ray of active sa
4600: 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  vepoints */.  in
4610: 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  t nSavepoint;   
4620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4630: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4640: 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  in aSavepoint[] 
4650: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
4660: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
4670: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
4680: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
4690: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  le changes */.  
46a0: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
46c0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
46d0: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
46e0: 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ck */..  u16 nEx
46f0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
4700: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4710: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
4720: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
4730: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
4740: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
4750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4760: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
4770: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
4780: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
4790: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
47a0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
47b0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
47c0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  n() */.  int pag
47d0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
47e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
47f0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
4800: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
4810: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
4820: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
4830: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
4840: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
4850: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
4860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4870: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
4880: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
4890: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
48a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
48b0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
48c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
48d0: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
48e0: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
48f0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
4900: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
4910: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
4920: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
4930: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
4940: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69  usyHandler */.#i
4950: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4960: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
4970: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ss;            /
4980: 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64  * Cache hits and
4990: 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e   missing */.  in
49a0: 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b  t nRead, nWrite;
49b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
49c0: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
49d0: 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64  /written */.#end
49e0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
49f0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
4a00: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
4a10: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
4a20: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
4a30: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
4a40: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
4a50: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
4a60: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
4a70: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
4a80: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
4a90: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
4aa0: 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
4ab0: 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f  ,int,int); /* No
4ac0: 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a  tify of page siz
4ad0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76  e changes */.  v
4ae0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
4af0: 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20  )(void*);       
4b00: 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
4b10: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65  tor for the code
4b20: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  c */.  void *pCo
4b30: 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  dec;            
4b40: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
4b50: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e  ment to xCodec..
4b60: 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e  . methods */.#en
4b70: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
4b80: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
4b90: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
4ba0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
4bb0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
4bc0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
4bd0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
4be0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
4bf0: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
4c00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  */.  sqlite3_bac
4c10: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20  kup *pBackup;   
4c20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c   /* Pointer to l
4c30: 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62  ist of ongoing b
4c40: 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
4c50: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4c60: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c  E_OMIT_WAL.  Wal
4c70: 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *pWal;         
4c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
4c90: 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64  e-ahead log used
4ca0: 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   by "journal_mod
4cb0: 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72  e=wal" */.  char
4cc0: 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *zWal;         
4cd0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
4ce0: 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61  name for write-a
4cf0: 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64  head log */.#end
4d00: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  if.};../*.** The
4d10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
4d20: 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  l variables hold
4d30: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66   counters used f
4d40: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75  or.** testing pu
4d50: 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68  rposes only.  Th
4d60: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f  ese variables do
4d70: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a   not exist in.**
4d80: 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62   a non-testing b
4d90: 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72  uild.  These var
4da0: 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74  iables are not t
4db0: 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23  hread-safe..*/.#
4dc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4dd0: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  T.int sqlite3_pa
4de0: 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
4df0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
4e00: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
4e10: 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f   read from DB */
4e20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4e30: 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
4e40: 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
4e50: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
4e60: 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f  written to DB */
4e70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4e80: 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20  er_writej_count 
4e90: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
4ea0: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
4eb0: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
4ec0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
4ed0: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
4ee0: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
4ef0: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
4f00: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  ..../*.** Journa
4f10: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
4f20: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
4f30: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
4f40: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
4f50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
4f60: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
4f70: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
4f80: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
4f90: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
4fa0: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
4fb0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
4fc0: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
4fd0: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
4fe0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
4ff0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
5000: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
5010: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a  ournal is being.
5020: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
5030: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
5040: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
5050: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
5060: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
5070: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
5080: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
5090: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
50a0: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
50b0: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
50c0: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
50d0: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
50e0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
50f0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
5100: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
5110: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
5120: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
5130: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
5140: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
5150: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
5160: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
5170: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
5180: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
5190: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
51a0: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
51b0: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
51c0: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
51d0: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
51e0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
51f0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
5200: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
5210: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
5220: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
5230: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
5240: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
5250: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
5260: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
5270: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
5280: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
5290: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
52a0: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
52b0: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
52c0: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
52d0: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
52e0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
52f0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
5300: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
5310: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
5320: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
5330: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
5340: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
5350: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
5360: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
5370: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
5380: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
5390: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
53a0: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
53b0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
53c0: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
53d0: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
53e0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
53f0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
5400: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
5410: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
5420: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5430: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
5440: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
5450: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
5460: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
5470: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
5480: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
5490: 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65  the of each page
54a0: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a   record in the j
54b0: 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20  ournal is given 
54c0: 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  by.** the follow
54d0: 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64  ing macro..*/.#d
54e0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
54f0: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
5500: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
5510: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
5520: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5530: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
5540: 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75  ger. This is usu
5550: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a  ally the same .*
5560: 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67  * size as a sing
5570: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
5580: 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74  See also setSect
5590: 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65  orSize()..*/.#de
55a0: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
55b0: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
55c0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
55d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
55e0: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
55f0: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
5600: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
5610: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
5620: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
5630: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
5640: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
5650: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
5660: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
5670: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
5680: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
5690: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
56a0: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
56b0: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
56c0: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
56d0: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
56e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
56f0: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
5700: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
5710: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
5720: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
5730: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
5740: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
5750: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
5760: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
5770: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
5780: 31 34 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64  147483647..#ifnd
5790: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
57a0: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
57b0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
57c0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
57d0: 72 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  r) );.*/.static 
57e0: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
57f0: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50  _state(Pager *pP
5800: 61 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74  ager){..  /* A t
5810: 65 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61  emp-file is alwa
5820: 79 73 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c  ys in PAGER_EXCL
5830: 55 53 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53  USIVE or PAGER_S
5840: 59 4e 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a  YNCED state. */.
5850: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
5860: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
5870: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
5880: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
5890: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61  );..  /* The cha
58a0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
58b0: 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  g is always set 
58c0: 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a  for temp-files *
58d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
58e0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
58f0: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
5900: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
5910: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
5920: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
5930: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
5940: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
5950: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
5960: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
5970: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
5980: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
5990: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
59a0: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
59b0: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
59c0: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
59d0: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
59e0: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
59f0: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
5a00: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
5a10: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
5a20: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
5a30: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
5a40: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
5a50: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
5a60: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
5a70: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
5a80: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
5a90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
5aa0: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
5ab0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e  Hdr *pPg){.  Pgn
5ac0: 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
5ad0: 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
5ae0: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
5af0: 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  r;.  int i;.  fo
5b00: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
5b10: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
5b20: 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  ){.    PagerSave
5b30: 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67  point *p = &pPag
5b40: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
5b50: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
5b60: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
5b70: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
5b80: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
5b90: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
5ba0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
5bb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
5bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5bd0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
5be0: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
5bf0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5c00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5c10: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
5c20: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
5c30: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
5c40: 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67  ecTest(pPg->pPag
5c50: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
5c60: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f  pPg->pgno);.}../
5c70: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
5c80: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
5c90: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
5ca0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
5cb0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
5cc0: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
5cd0: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
5ce0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
5cf0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
5d00: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
5d10: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
5d20: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
5d30: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
5d40: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
5d50: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
5d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5d70: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
5d80: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
5d90: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
5da0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
5db0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
5dc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5dd0: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
5de0: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
5df0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5e00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
5e10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
5e20: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
5e30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5e40: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
5e50: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
5e60: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
5e70: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
5e80: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
5e90: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
5ea0: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
5eb0: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a  te((u8*)A,B)../*
5ec0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
5ed0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
5ee0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
5ef0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
5f00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
5f10: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
5f20: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
5f30: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5f40: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
5f50: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73  nt write32bits(s
5f60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
5f70: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
5f80: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
5f90: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
5fa0: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
5fb0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
5fc0: 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66  te(fd, ac, 4, of
5fd0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
5fe0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
5ff0: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
6000: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6010: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
6020: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
6030: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
6040: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
6050: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
6060: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
6070: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
6080: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
6090: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
60a0: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
60b0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
60c0: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
60d0: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
60e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
60f0: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
6100: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
6110: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
6120: 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  hods)../*.** If 
6130: 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e  file pFd is open
6140: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73  , call sqlite3Os
6150: 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a  Unlock() on it..
6160: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  */.static int os
6170: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
6180: 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c  ile *pFd, int eL
6190: 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f  ock){.  if( !isO
61a0: 70 65 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20  pen(pFd) ){.    
61b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
61c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
61d0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
61e0: 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f  Fd, eLock);.}../
61f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6200: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  on determines wh
6210: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
6220: 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
6230: 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61  timization.** ca
6240: 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74  n be used with t
6250: 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f  his pager. The o
6260: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
6270: 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a  be used if:.**.*
6280: 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65  *  (a) the value
6290: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44   returned by OsD
62a0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
62b0: 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73  tics() indicates
62c0: 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20   that.**      a 
62d0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61  database page ma
62e0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  y be written ato
62f0: 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20  mically, and.** 
6300: 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72   (b) the value r
6310: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63  eturned by OsSec
6320: 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73  torSize() is les
6330: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
6340: 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70  **      to the p
6350: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
6360: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
6370: 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20   is also always 
6380: 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70  enabled for temp
6390: 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20  orary files. It 
63a0: 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74  is.** an error t
63b0: 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  o call this func
63c0: 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69  tion if pPager i
63d0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69  s opened on an i
63e0: 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61  n-memory.** data
63f0: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  base..**.** If t
6400: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
6410: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
6420: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  0 is returned. I
6430: 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  f it can be used
6440: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61  ,.** then the va
6450: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
6460: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6470: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
6480: 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  n it.** contains
6490: 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66   rollback data f
64a0: 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70  or exactly one p
64b0: 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  age..*/.#ifdef S
64c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
64d0: 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63  MIC_WRITE.static
64e0: 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53   int jrnlBufferS
64f0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
6500: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  r){.  assert( !M
6510: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70  EMDB );.  if( !p
6520: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
6530: 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20  ){.    int dc;  
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
6560: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
6570: 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  cs */.    int nS
6580: 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ector;          
6590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
65a0: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
65b0: 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20    int szPage;   
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
65e0: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
65f0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
6600: 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20  fd) );.    dc = 
6610: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
6620: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
6630: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
6640: 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72  nSector = pPager
6650: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
6660: 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65    szPage = pPage
6670: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20  r->pageSize;..  
6680: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
6690: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
66a0: 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20  =(512>>8));.    
66b0: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
66c0: 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
66d0: 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
66e0: 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49  if( 0==(dc&(SQLI
66f0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
6700: 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20  (szPage>>8)) || 
6710: 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20  nSector>szPage) 
6720: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6730: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
6740: 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48  return JOURNAL_H
6750: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
6760: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
6770: 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ager);.}.#endif.
6780: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
6790: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20  _CHECK_PAGES is 
67a0: 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20  defined then we 
67b0: 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63  do some sanity c
67c0: 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  hecking.** on th
67d0: 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20  e cache using a 
67e0: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20  hash function.  
67f0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
6800: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20   testing.** and 
6810: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
6820: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
6830: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
6840: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
6850: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
6860: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
6870: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
6880: 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  2 pager_datahash
6890: 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69  (int nByte, unsi
68a0: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
68b0: 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20  ){.  u32 hash = 
68c0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
68d0: 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20  r(i=0; i<nByte; 
68e0: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
68f0: 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70   (hash*1039) + p
6900: 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  Data[i];.  }.  r
6910: 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74  eturn hash;.}.st
6920: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70  atic u32 pager_p
6930: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
6940: 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
6950: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
6960: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
6970: 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65  geSize, (unsigne
6980: 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e  d char *)pPage->
6990: 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63  pData);.}.static
69a0: 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f   void pager_set_
69b0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
69c0: 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d  pPage){.  pPage-
69d0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
69e0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65  r_pagehash(pPage
69f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
6a00: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
6a10: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
6a20: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
6a30: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
6a40: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
6a50: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
6a60: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
6a70: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
6a80: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
6a90: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
6aa0: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
6ab0: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
6ac0: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
6ad0: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
6ae0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
6af0: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
6b00: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
6b10: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
6b20: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
6b30: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
6b40: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
6b50: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
6b60: 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  ger->errCode.   
6b70: 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67     || (pPg->flag
6b80: 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c  s&PGHDR_DIRTY) |
6b90: 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d  | pPg->pageHash=
6ba0: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
6bb0: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
6bc0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64  .#define pager_d
6bd0: 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a  atahash(X,Y)  0.
6be0: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61  #define pager_pa
6bf0: 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65  gehash(X)  0.#de
6c00: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
6c10: 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51  x).#endif  /* SQ
6c20: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
6c30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20   */../*.** When 
6c40: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
6c50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6c60: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
6c70: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
6c80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6c90: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64  attempts to read
6ca0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
6cb0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d  l file name from
6cc0: 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20   the .** end of 
6cd0: 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66  the file and, if
6ce0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70   successful, cop
6cf0: 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  ies it into memo
6d00: 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ry supplied .** 
6d10: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
6d20: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
6d30: 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  e writeMasterJou
6d40: 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66  rnal() for the f
6d50: 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f  ormat.** used to
6d60: 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20   store a master 
6d70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
6d80: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
6d90: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
6da0: 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75  **.** zMaster mu
6db0: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
6dc0: 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
6dd0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61   nMaster bytes a
6de0: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
6df0: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20  he caller. This 
6e00: 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65  should be sqlite
6e10: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
6e20: 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68  +1 (to ensure th
6e30: 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68  ere is.** enough
6e40: 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20   space to write 
6e50: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6e60: 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65  al name). If the
6e70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
6e80: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a  ** name in the j
6e90: 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72  ournal is longer
6ea0: 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79   than nMaster by
6eb0: 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61  tes (including a
6ec0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
6ed0: 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69  or), then this i
6ee0: 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  s handled as if 
6ef0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
6f00: 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70  l name.** were p
6f10: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f  resent in the jo
6f20: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
6f30: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
6f40: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
6f50: 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  esent at the end
6f60: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
6f70: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  ** file, then it
6f80: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
6f90: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
6fa0: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
6fb0: 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  . A.** nul-termi
6fc0: 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70  nator byte is ap
6fd0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
6fe0: 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ffer following t
6ff0: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
7000: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  rnal file name..
7010: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64  **.** If it is d
7020: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
7030: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
7040: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
7050: 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65  esent .** zMaste
7060: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
7070: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
7080: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
7090: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
70a0: 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  s while reading 
70b0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
70c0: 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65   file, an SQLite
70d0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
70e0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
70f0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
7100: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
7110: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
7120: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
7130: 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  u32 nMaster){.  
7140: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
7150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7160: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
7170: 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
7180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
7190: 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20  gth in bytes of 
71a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
71b0: 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a  ame */.  i64 szJ
71c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
71d0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
71e0: 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f  e in bytes of jo
71f0: 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c  urnal file pJrnl
7200: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20   /* MJ checksum 
7230: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
7240: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
7250: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
7260: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
7270: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
7280: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
7290: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
72a0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
72b0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
72c0: 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74  eader */.  zMast
72d0: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
72e0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
72f0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
7300: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
7310: 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c  szJ)).   || szJ<
7320: 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  16.   || SQLITE_
7330: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
7340: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
7350: 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c  16, &len)).   ||
7360: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20   len>=nMaster . 
7370: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
7380: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
7390: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
73a0: 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53  &cksum)).   || S
73b0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
73c0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
73d0: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  rnl, aMagic, 8, 
73e0: 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65  szJ-8)).   || me
73f0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
7400: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20  urnalMagic, 8). 
7410: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
7420: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
7430: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
7440: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
7450: 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  len)).  ){.    r
7460: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
7470: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
7480: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
7490: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
74a0: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
74b0: 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b  (u=0; u<len; u++
74c0: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
74d0: 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a  zMaster[u];.  }.
74e0: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
74f0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
7500: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
7510: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
7520: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
7530: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
7540: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
7550: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7560: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
7570: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
7580: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
7590: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
75a0: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
75b0: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
75c0: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
75d0: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
75e0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
75f0: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20  /.    len = 0;. 
7600: 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e   }.  zMaster[len
7610: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20  ] = '\0';.   .  
7620: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7640: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  n the offset of 
7650: 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  the sector bound
7660: 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69  ary at or immedi
7670: 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  ately .** follow
7680: 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ing the value in
7690: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
76a0: 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20  Off, assuming a 
76b0: 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20  sector .** size 
76c0: 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  of pPager->secto
76d0: 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  rSize bytes..**.
76e0: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
76f0: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
7700: 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a  .**.**   Pager.j
7710: 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20  ournalOff       
7720: 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a     Return value.
7730: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
7760: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
7770: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
7780: 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20     512          
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
77a0: 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20  .**   100       
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20  512.**   2000   
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
77f0: 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61  tatic i64 journa
7800: 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72  lHdrOffset(Pager
7810: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
7820: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
7830: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
7840: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
7850: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
7860: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
7870: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7880: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
7890: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
78a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
78b0: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
78c0: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
78d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
78e0: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
78f0: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
7900: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7910: 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
7920: 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   offset;.}../*.*
7930: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
7940: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
7950: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
7960: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
7970: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7980: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
7990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
79a0: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72   has not been wr
79b0: 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68  itten to.** with
79c0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
79d0: 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e  ransaction (i.e.
79e0: 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   if Pager.journa
79f0: 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20  lOff==0)..**.** 
7a00: 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73  If doTruncate is
7a10: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65   non-zero or the
7a20: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
7a30: 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65  zeLimit variable
7a40: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c   is.** set to 0,
7a50: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
7a60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7a70: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
7a80: 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65   size. Otherwise
7a90: 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38  ,.** zero the 28
7aa0: 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20  -byte header at 
7ab0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
7ac0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
7ad0: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a  n either case, .
7ae0: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
7af0: 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  is not in no-syn
7b00: 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  c mode, sync the
7b10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
7b20: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66  mediately .** af
7b30: 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74  ter writing or t
7b40: 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a  runcating it..**
7b50: 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75  .** If Pager.jou
7b60: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73  rnalSizeLimit is
7b70: 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69   set to a positi
7b80: 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ve, non-zero val
7b90: 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f  ue, and.** follo
7ba0: 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74  wing the truncat
7bb0: 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64  ion or zeroing d
7bc0: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74  escribed above t
7bd0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
7be0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
7bf0: 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67  in bytes is larg
7c00: 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
7c10: 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74  ue, then truncat
7c20: 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
7c30: 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a   file to Pager.j
7c40: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
7c50: 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e  bytes. The journ
7c60: 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
7c70: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73  not need to be s
7c80: 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
7c90: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
7ca0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
7cb0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61  rror occurs, aba
7cc0: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
7cd0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49  and return the I
7ce0: 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  O error code..**
7cf0: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
7d00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
7d10: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f  .static int zero
7d20: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
7d30: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f   *pPager, int do
7d40: 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74  Truncate){.  int
7d50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7d80: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
7d90: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
7da0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
7db0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7dc0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
7dd0: 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d    const i64 iLim
7de0: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  it = pPager->jou
7df0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
7e00: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
7e10: 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20   of jsl */..    
7e20: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
7e30: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
7e40: 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75  )).    if( doTru
7e50: 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d  ncate || iLimit=
7e60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
7e70: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
7e80: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
7e90: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
7ea0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
7eb0: 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32  t char zeroHdr[2
7ec0: 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20  8] = {0};.      
7ed0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
7ee0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7ef0: 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66   zeroHdr, sizeof
7f00: 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20  (zeroHdr), 0);. 
7f10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
7f20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
7f30: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
7f40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7f50: 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
7f60: 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
7f70: 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67  NC_DATAONLY|pPag
7f80: 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
7f90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
7fa0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
7fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7fc0: 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68  committed but th
7fd0: 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20  e write lock .  
7fe0: 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65    ** is still he
7ff0: 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  ld on the file. 
8000: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69  If there is a si
8010: 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75  ze limit configu
8020: 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  red for .    ** 
8030: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a  the persistent j
8040: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a  ournal and the j
8050: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72  ournal file curr
8060: 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d  ently consumes m
8070: 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  ore.    ** space
8080: 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74   than that limit
8090: 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75   allows for, tru
80a0: 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68  ncate it now. Th
80b0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
80c0: 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68     ** to sync th
80d0: 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67  e file following
80e0: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
80f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8100: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8110: 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20   iLimit>0 ){.   
8120: 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20     i64 sz;.     
8130: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
8140: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
8150: 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20  jfd, &sz);.     
8160: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8170: 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20  OK && sz>iLimit 
8180: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8190: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
81a0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  e(pPager->jfd, i
81b0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Limit);.      }.
81c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
81d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
81e0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
81f0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
8200: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8210: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
8220: 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28  rnal.** header (
8230: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
8240: 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e  ytes) is written
8250: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
8260: 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a  l file at the.**
8270: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
8280: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
8290: 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  mat for the jour
82a0: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73  nal header is as
82b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38   follows:.** - 8
82c0: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
82d0: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
82e0: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34  l format..** - 4
82f0: 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
8300: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
8310: 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
8320: 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
8330: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61  ** - 4 bytes: Ra
8340: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64  ndom number used
8350: 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a   for page hash..
8360: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
8370: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
8380: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20  age count..** - 
8390: 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20  4 bytes: Sector 
83a0: 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
83b0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
83c0: 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ote this journal
83d0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
83e0: 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  Database page si
83f0: 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  ze..** .** Follo
8400: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
8410: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
8420: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
8430: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
8440: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
8450: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
8460: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
8470: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
8480: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
8490: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  n code */.  char
84a0: 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67   *zHeader = pPag
84b0: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
84c0: 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61  /* Temporary spa
84d0: 63 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  ce used to build
84e0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
84f0: 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
8500: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20  r->pageSize;    
8510: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
8520: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
8530: 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33   zHeader */.  u3
8540: 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  2 nWrite;       
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65    /* Bytes of he
8570: 61 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74  ader sector writ
8580: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ten */.  int ii;
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85b0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
85c0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
85d0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
85e0: 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  ;      /* Journa
85f0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
8600: 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e  pen. */..  if( n
8610: 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48  Header>JOURNAL_H
8620: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
8630: 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a  .    nHeader = J
8640: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
8650: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
8660: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
8670: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
8680: 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  and any of them 
8690: 77 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20  were created .  
86a0: 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73  ** since the mos
86b0: 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c  t recent journal
86c0: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
86d0: 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20  ten, update the 
86e0: 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
86f0: 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
8700: 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f  fields now..  */
8710: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
8720: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
8730: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  nt; ii++){.    i
8740: 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65  f( pPager->aSave
8750: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
8760: 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fset==0 ){.     
8770: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
8780: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
8790: 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  et = pPager->jou
87a0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
87b0: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
87c0: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
87d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
87e0: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
87f0: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
8800: 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20  .  ** Write the 
8810: 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65  nRec Field - the
8820: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
8830: 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c  records that fol
8840: 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f  low this.  ** jo
8850: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f  urnal header. No
8860: 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20  rmally, zero is 
8870: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20  written to this 
8880: 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69  value at this ti
8890: 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74  me..  ** After t
88a0: 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61  he records are a
88b0: 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  dded to the jour
88c0: 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75  nal (and the jou
88d0: 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20  rnal synced, .  
88e0: 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79  ** if in full-sy
88f0: 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65  nc mode), the ze
8900: 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  ro is overwritte
8910: 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20  n with the true 
8920: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72  number.  ** of r
8930: 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63  ecords (see sync
8940: 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a  Journal())..  **
8950: 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61  .  ** A faster a
8960: 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f  lternative is to
8970: 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46   write 0xFFFFFFF
8980: 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69  F to the nRec fi
8990: 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72  eld. When.  ** r
89a0: 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eading the journ
89b0: 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65  al this value te
89c0: 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73  lls SQLite to as
89d0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20  sume that the.  
89e0: 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  ** rest of the j
89f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
8a00: 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20  ains valid page 
8a10: 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73  records. This as
8a20: 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  sumption.  ** is
8a30: 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69   dangerous, as i
8a40: 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
8a50: 72 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  rred whilst writ
8a60: 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
8a70: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20  al.  ** file it 
8a80: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65  may contain some
8a90: 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54   garbage data. T
8aa0: 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65  here are two sce
8ab0: 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72  narios.  ** wher
8ac0: 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20  e this risk can 
8ad0: 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a  be ignored:.  **
8ae0: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
8af0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
8b00: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72  o-sync mode. Cor
8b10: 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c  ruption can foll
8b20: 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f  ow a.  **     po
8b30: 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74  wer failure in t
8b40: 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e  his case anyway.
8b50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
8b60: 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49  hen the SQLITE_I
8b70: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
8b80: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68   flag is set. Th
8b90: 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20  is guarantees.  
8ba0: 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62  **     that garb
8bb0: 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65  age data is neve
8bc0: 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  r appended to th
8bd0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
8be0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
8bf0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
8c00: 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ) || pPager->noS
8c10: 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50  ync );.  if( (pP
8c20: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c  ager->noSync) ||
8c30: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
8c40: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
8c50: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
8c60: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
8c70: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
8c80: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
8c90: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
8ca0: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
8cb0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
8cc0: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
8cd0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
8ce0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
8cf0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
8d00: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
8d10: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
8d20: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
8d30: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
8d40: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
8d50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
8d60: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
8d70: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
8d80: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
8d90: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
8da0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
8db0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
8dc0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
8dd0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
8de0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
8df0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
8e00: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
8e10: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
8e20: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
8e30: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
8e40: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8e50: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8e60: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
8e70: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
8e80: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
8e90: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
8ea0: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
8eb0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
8ec0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
8ed0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
8ee0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
8ef0: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
8f00: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
8f10: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
8f20: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
8f30: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
8f40: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8f50: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
8f60: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
8f70: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
8f80: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
8f90: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
8fa0: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
8fb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
8fc0: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
8fd0: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
8fe0: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
8ff0: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
9000: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
9010: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
9020: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
9030: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
9040: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
9050: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
9060: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9070: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
9080: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
9090: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
90a0: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
90b0: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
90c0: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
90d0: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
90e0: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
90f0: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
9100: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
9110: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
9120: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
9130: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
9140: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
9150: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
9160: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
9170: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
9180: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
9190: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
91a0: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
91b0: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
91c0: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
91d0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
91e0: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
91f0: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
9200: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
9210: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
9220: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
9230: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
9240: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
9250: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
9260: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
9270: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
9280: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
9290: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
92a0: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
92b0: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
92c0: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
92d0: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
92e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
92f0: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
9300: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
9310: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
9320: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
9330: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
9340: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
9350: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
9360: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
9370: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
9380: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
9390: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
93a0: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
93b0: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
93c0: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
93d0: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
93e0: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
93f0: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
9400: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
9410: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
9420: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
9430: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
9440: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
9450: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
9460: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
9470: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
9480: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
9490: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
94a0: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
94b0: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
94c0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
94d0: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
94e0: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
94f0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9500: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
9510: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
9520: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
9530: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9540: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
9550: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9560: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
9570: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9580: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
9590: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
95a0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
95b0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
95c0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
95d0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
95e0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
95f0: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
9600: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
9610: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
9620: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
9630: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
9640: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
9650: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
9660: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
9670: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
9680: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
9690: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
96a0: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
96b0: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
96c0: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
96d0: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
96e0: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
96f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
9700: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
9710: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
9720: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
9730: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
9740: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
9750: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
9760: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
9770: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
9780: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
9790: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
97a0: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
97b0: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
97c0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
97d0: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
97e0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
97f0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
9800: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
9810: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
9820: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
9830: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
9840: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
9850: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
9860: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
9870: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
9880: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
9890: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
98a0: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
98b0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
98c0: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
98d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
98e0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
98f0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
9900: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
9910: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
9920: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
9930: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
9940: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
9950: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
9960: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
9970: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
9980: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
9990: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
99a0: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
99b0: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99d0: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
99e0: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
99f0: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
9a00: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
9a10: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
9a20: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
9a30: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
9a40: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
9a50: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
9a70: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
9a80: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
9a90: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
9aa0: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
9ab0: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
9ac0: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
9ad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9ae0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
9af0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
9b00: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
9b10: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
9b20: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
9b30: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
9b40: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
9b50: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
9b60: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
9b70: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
9b80: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
9b90: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
9ba0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9bb0: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
9bc0: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
9bd0: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
9be0: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
9bf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
9c00: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
9c10: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
9c20: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
9c30: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
9c40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9c50: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
9c60: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
9c70: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
9c80: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
9c90: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
9ca0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9cb0: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
9cc0: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
9cd0: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
9ce0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
9cf0: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
9d00: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
9d10: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
9d20: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
9d30: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
9d40: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
9d50: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
9d60: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
9d70: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
9d80: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
9d90: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
9da0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
9db0: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
9dc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
9dd0: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
9de0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
9df0: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
9e00: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
9e10: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
9e20: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
9e30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
9e40: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
9e50: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
9e60: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
9e70: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
9e80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9e90: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
9ea0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
9eb0: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
9ec0: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
9ed0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
9ee0: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
9ef0: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
9f00: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
9f10: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
9f20: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
9f30: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
9f40: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
9f50: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
9f60: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
9f70: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
9f80: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
9f90: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
9fa0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
9fb0: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
9fc0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
9fd0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
9fe0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
9ff0: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
a000: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
a010: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
a020: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a030: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
a040: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
a050: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
a060: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
a070: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
a080: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
a090: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a0b0: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
a0c0: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
a0d0: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
a0e0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
a0f0: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
a100: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
a110: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
a120: 20 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65     u16 iPageSize
a130: 31 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  16;             
a140: 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65  /* Copy of iPage
a150: 53 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76  Size in 16-bit v
a160: 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  ariable */..    
a170: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
a180: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
a190: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
a1a0: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
a1b0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
a1c0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
a1d0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
a1e0: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
a1f0: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
a200: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
a210: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a220: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
a230: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
a240: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
a250: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a260: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
a270: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
a280: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
a290: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
a2a0: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
a2b0: 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
a2c0: 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
a2d0: 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
a2e0: 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
a2f0: 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
a300: 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
a310: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
a320: 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
a330: 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
a340: 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
a350: 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
a360: 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
a370: 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
a380: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
a390: 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
a3a0: 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
a3b0: 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
a3c0: 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
a3d0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
a3e0: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
a3f0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
a400: 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
a410: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
a420: 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
a430: 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
a440: 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
a450: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
a460: 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
a470: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
a480: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
a490: 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
a4a0: 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
a4b0: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
a4c0: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
a4d0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
a4e0: 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
a4f0: 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
a500: 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
a510: 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
a520: 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
a530: 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
a540: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
a550: 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
a560: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a570: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
a580: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
a590: 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
a5a0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
a5b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
a5c0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
a5d0: 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
a5e0: 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
a5f0: 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
a600: 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
a610: 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
a620: 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
a630: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61  ..    */.    iPa
a640: 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29  geSize16 = (u16)
a650: 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  iPageSize;.    r
a660: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
a670: 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
a680: 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36  er, &iPageSize16
a690: 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
a6a0: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
a6b0: 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OK );.    assert
a6c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a6d0: 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d  || iPageSize16==
a6e0: 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29  (u16)iPageSize )
a6f0: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
a700: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
a710: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
a720: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
a730: 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
a740: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
a750: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
a760: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
a770: 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
a780: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
a790: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
a7a0: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
a7b0: 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
a7c0: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
a7d0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
a7e0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
a7f0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
a800: 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
a810: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
a820: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
a830: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
a840: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
a850: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
a860: 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
a870: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
a880: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
a890: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
a8a0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
a8b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
a8c0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
a8d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
a8e0: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
a8f0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
a900: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
a910: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
a920: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
a930: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
a940: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
a950: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
a960: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
a970: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
a980: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
a990: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
a9a0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
a9b0: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
a9c0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
a9d0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
a9e0: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
a9f0: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
aa00: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
aa10: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
aa20: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
aa30: 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
aa40: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
aa50: 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
aa60: 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
aa70: 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
aa80: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
aa90: 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
aaa0: 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
aab0: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
aac0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
aad0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
aae0: 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
aaf0: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
ab00: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
ab10: 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
ab20: 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
ab30: 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
ab40: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
ab50: 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
ab60: 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
ab70: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
ab80: 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
ab90: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
aba0: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
abb0: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
abc0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
abd0: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
abe0: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
abf0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
ac00: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
ac10: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
ac20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
ac30: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
ac40: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ac70: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
ac80: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
ac90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
aca0: 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
acb0: 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
acc0: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ace0: 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
acf0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
ad00: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
ad10: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
ad20: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ad30: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
ad40: 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
ad50: 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad70: 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
ad80: 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
ad90: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
ada0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
adb0: 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  er.   || pPager-
adc0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
add0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
ade0: 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50  MEMORY .   || pP
adf0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ae00: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ae10: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20  MODE_OFF .  ){. 
ae20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ae30: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
ae40: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
ae50: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
ae60: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
ae70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ae80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
ae90: 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
aea0: 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
aeb0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
aec0: 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
aed0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
aee0: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
aef0: 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
af00: 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
af10: 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
af20: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
af30: 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
af40: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
af50: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
af60: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
af70: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
af80: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
af90: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
afa0: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
afb0: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
afc0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
afd0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
afe0: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
aff0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
b000: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
b010: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
b020: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b030: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
b040: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
b050: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
b060: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b070: 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
b080: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b090: 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
b0a0: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
b0b0: 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
b0c0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
b0d0: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
b0e0: 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
b0f0: 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
b100: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
b110: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
b120: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
b130: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
b140: 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
b150: 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
b160: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
b170: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
b180: 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
b190: 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
b1a0: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
b1b0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
b1c0: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
b1d0: 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
b1e0: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
b1f0: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
b200: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
b210: 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
b220: 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
b230: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
b240: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
b250: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
b260: 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
b270: 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
b280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
b290: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
b2a0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
b2b0: 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50  Master+20);.  pP
b2c0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
b2d0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
b2e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
b2f0: 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
b300: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
b310: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
b320: 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
b330: 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
b340: 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
b350: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
b360: 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
b370: 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
b380: 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
b390: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
b3a0: 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
b3b0: 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
b3c0: 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
b3d0: 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
b3e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
b3f0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
b400: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
b410: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
b420: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
b430: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
b440: 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
b450: 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
b460: 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
b470: 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
b480: 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
b490: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
b4a0: 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
b4b0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
b4c0: 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
b4d0: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
b4e0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
b4f0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
b500: 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
b510: 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
b520: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
b530: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
b540: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
b550: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
b560: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
b570: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
b590: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
b5a0: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
b5b0: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
b5c0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
b5d0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
b5e0: 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
b5f0: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
b600: 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
b610: 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
b620: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
b630: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
b640: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
b650: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
b680: 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
b690: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
b6a0: 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
b6b0: 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
b6c0: 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
b6d0: 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
b6e0: 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
b6f0: 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
b700: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
b710: 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
b720: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
b730: 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
b740: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
b750: 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
b760: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
b770: 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
b780: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
b790: 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  e, discard all i
b7a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20  n-memory pages. 
b7b0: 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  If.** the pager 
b7c0: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
b7d0: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  e, then this cal
b7e0: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  l is a no-op..**
b7f0: 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61  .** TODO: Why ca
b800: 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74  n we not reset t
b810: 68 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69  he pager while i
b820: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a  n error state?.*
b830: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
b840: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
b850: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
b860: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65  SQLITE_OK==pPage
b870: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
b880: 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
b890: 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
b8a0: 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c  Backup);.    sql
b8b0: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
b8c0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
b8d0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
b8e0: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
b8f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
b900: 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
b910: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
b920: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
b930: 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
b940: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
b950: 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
b960: 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
b970: 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
b980: 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
b990: 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
b9a0: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
b9b0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
b9c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
b9d0: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
b9e0: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
b9f0: 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
ba00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
ba10: 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
ba20: 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
ba30: 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
ba40: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
ba50: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
ba60: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
ba70: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
ba80: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
ba90: 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
baa0: 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
bab0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
bac0: 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
bad0: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
bae0: 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
baf0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
bb00: 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
bb10: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
bb20: 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
bb30: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
bb40: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
bb50: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
bb60: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
bb70: 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
bb80: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
bb90: 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
bba0: 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
bbb0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
bbc0: 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
bbd0: 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
bbe0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
bbf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
bc00: 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
bc10: 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
bc20: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
bc30: 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
bc40: 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
bc50: 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
bc60: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
bc70: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
bc80: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
bc90: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bca0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
bcb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
bcc0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
bcd0: 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
bce0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
bcf0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
bd00: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
bd10: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
bd20: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
bd30: 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
bd40: 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
bd50: 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
bd60: 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
bd70: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
bd80: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
bd90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
bda0: 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
bdb0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
bdc0: 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
bdd0: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
bde0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bdf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
be00: 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67  true if this pag
be10: 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d  er uses a write-
be20: 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61  ahead log instea
be30: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
be40: 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
be50: 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61  al. Otherwise fa
be60: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  lse..*/.#ifndef 
be70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
be80: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
be90: 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50  UseWal(Pager *pP
bea0: 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
beb0: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30  (pPager->pWal!=0
bec0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
bed0: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
bee0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
bef0: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
bf00: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
bf10: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
bf20: 78 2c 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e  x,y,z) 0.# defin
bf30: 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  e pagerOpenWalIf
bf40: 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54  Present(z) SQLIT
bf50: 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61  E_OK.# define pa
bf60: 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
bf70: 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54  saction(z) SQLIT
bf80: 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
bf90: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
bfa0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
bfb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
bfc0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67  no-op if the pag
bfd0: 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c  er.** is in excl
bfe0: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
bff0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
c000: 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65  s currently in e
c010: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63  rror state, disc
c020: 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
c030: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68   of .** the cach
c040: 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
c050: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
c060: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20  internal state. 
c070: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  If there is.** a
c080: 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66  n open journal-f
c090: 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65  ile, then the ne
c0a0: 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64  xt time a shared
c0b0: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
c0c0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65  d.** on the page
c0d0: 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20  r file (by this 
c0e0: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
c0f0: 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62  cess), it will b
c100: 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20  e.** treated as 
c110: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
c120: 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  d rolled back..*
c130: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
c140: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
c150: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
c160: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
c170: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
c180: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c190: 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
c1a0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
c1b0: 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
c1c0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
c1d0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c1e0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c1f0: 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
c200: 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
c210: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
c220: 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
c230: 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
c240: 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
c250: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c260: 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
c270: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
c280: 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
c290: 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
c2a0: 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
c2b0: 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
c2c0: 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
c2d0: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
c2e0: 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
c2f0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
c300: 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
c310: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
c320: 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
c330: 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
c340: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
c350: 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
c360: 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
c370: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
c380: 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
c390: 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
c3a0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
c3b0: 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
c3c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
c3d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
c3e0: 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
c3f0: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
c400: 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
c410: 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
c420: 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
c430: 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
c440: 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
c450: 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
c460: 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
c470: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
c480: 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
c490: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c4a0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c4b0: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42   }..    sqlite3B
c4c0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
c4d0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
c4e0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
c4f0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
c500: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
c510: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
c520: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
c530: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c  ile is unlocked,
c540: 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d   somebody else m
c550: 69 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20  ight change it. 
c560: 54 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  The.    ** value
c570: 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  s stored in Page
c580: 72 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69  r.dbSize etc. mi
c590: 67 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c  ght become inval
c5a0: 69 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69  id if.    ** thi
c5b0: 73 20 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65 20  s happens.  One 
c5c0: 63 61 6e 20 61 72 67 75 65 20 74 68 61 74 20 74  can argue that t
c5d0: 68 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  his doesn't need
c5e0: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20   to be cleared. 
c5f0: 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20     ** until the 
c600: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
c610: 68 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61  heck fails in Pa
c620: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e  gerSharedLock().
c630: 0a 20 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e 67  .    ** Clearing
c640: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63   the page size c
c650: 61 63 68 65 20 68 65 72 65 20 69 73 20 62 65 69  ache here is bei
c660: 6e 67 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  ng conservative.
c670: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
c680: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
c690: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  = 0;..    if( pa
c6a0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
c6b0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
c6c0: 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
c6d0: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
c6e0: 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
c6f0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55  {.      rc = osU
c700: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
c710: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
c720: 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
c730: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
c740: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
c750: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
c760: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
c770: 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49  ager))..    /* I
c780: 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
c790: 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
c7a0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
c7b0: 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
c7c0: 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64  e.    ** trusted
c7d0: 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70  . Now that the p
c7e0: 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c  ager file is unl
c7f0: 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65  ocked, the conte
c800: 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
c810: 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  * cache can be d
c820: 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65  iscarded and the
c830: 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65   error code safe
c840: 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  ly cleared..    
c850: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
c860: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
c870: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c880: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
c890: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
c8a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c8b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65      }.      page
c8c0: 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
c8d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
c8e0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
c8f0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
c900: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
c910: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70  ER_UNLOCK;.    p
c920: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
c930: 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 0;.  }.}../*
c940: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c950: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
c960: 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52  ed when an IOERR
c970: 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c  , CORRUPT or FUL
c980: 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68  L error.** may h
c990: 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68  ave occurred. Th
c9a0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
c9b0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c9c0: 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73   the pager .** s
c9d0: 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
c9e0: 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63  cond the error-c
c9f0: 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
ca00: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
ca10: 67 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63  ger .** API func
ca20: 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20  tion. The value 
ca30: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
ca40: 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
ca50: 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f   argument .** to
ca60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
ca70: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
ca80: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
ca90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
caa0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
cab0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a  r SQLITE_FULL.**
cac0: 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d   the error becom
cad0: 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55  es persistent. U
cae0: 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74  ntil the persist
caf0: 65 6e 74 20 65 72 72 6f 72 20 69 73 20 63 6c 65  ent error is cle
cb00: 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75  ared,.** subsequ
cb10: 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e  ent API calls on
cb20: 20 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c   this Pager will
cb30: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
cb40: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  urn the same .**
cb50: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
cb60: 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20  ** A persistent 
cb70: 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20  error indicates 
cb80: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
cb90: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
cba0: 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
cbb0: 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
cbc0: 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
cbd0: 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
cbe0: 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
cbf0: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
cc00: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
cc10: 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
cc20: 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
cc30: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
cc40: 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
cc50: 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
cc60: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
cc70: 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
cc80: 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
cc90: 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
cca0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
ccb0: 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
ccc0: 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
ccd0: 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
cce0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
ccf0: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
cd00: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
cd10: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
cd20: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
cd30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
cd40: 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
cd50: 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
cd60: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
cd70: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
cd80: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
cd90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
cda0: 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
cdb0: 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
cdc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
cdd0: 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
cde0: 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
cdf0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
ce00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
ce10: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20  Code = rc;.  }. 
ce20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ce30: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
ce40: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
ce50: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
ce60: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
ce70: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
ce80: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
ce90: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
cea0: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
ceb0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
cec0: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
ced0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
cee0: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
cef0: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
cf00: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
cf10: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
cf20: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
cf30: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
cf40: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
cf50: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
cf60: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
cf70: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
cf80: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
cf90: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
cfa0: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
cfb0: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
cfc0: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
cfd0: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
cfe0: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
cff0: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
d000: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
d010: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
d020: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
d030: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
d040: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
d050: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
d060: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
d070: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
d080: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
d090: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
d0a0: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
d0b0: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
d0c0: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
d0d0: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
d0e0: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
d0f0: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
d100: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
d110: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
d120: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
d130: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
d140: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
d150: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
d160: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
d170: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
d180: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
d190: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
d1a0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
d1b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
d1c0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
d1d0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
d1e0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
d1f0: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
d200: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
d210: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
d220: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
d230: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
d240: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
d250: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
d260: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
d270: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
d280: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
d290: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
d2a0: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
d2b0: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
d2c0: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
d2d0: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
d2e0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
d2f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
d300: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
d310: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d320: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
d330: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
d340: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
d350: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
d360: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
d370: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
d380: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
d390: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
d3a0: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
d3b0: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
d3c0: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
d3d0: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
d3e0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
d3f0: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
d400: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
d410: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
d420: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
d430: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
d440: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
d450: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
d460: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
d470: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
d480: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
d490: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
d4a0: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
d4b0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
d4c0: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
d4d0: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
d4e0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
d4f0: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
d500: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
d510: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
d520: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
d530: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
d540: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
d550: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
d560: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
d570: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
d580: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
d590: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
d5a0: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
d5b0: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
d5c0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
d5d0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
d5e0: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
d5f0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
d600: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
d610: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
d620: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
d630: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
d640: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
d650: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
d660: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
d670: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
d680: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
d690: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
d6a0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
d6b0: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
d6c0: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
d6d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d6e0: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
d6f0: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
d700: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
d710: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
d720: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
d730: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
d740: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
d750: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
d760: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
d770: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
d780: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
d790: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
d7a0: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
d7b0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
d7c0: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
d7d0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
d7e0: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
d7f0: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
d800: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
d810: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d820: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
d830: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
d840: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d850: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
d860: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
d870: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
d880: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
d890: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
d8a0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
d8b0: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
d8c0: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
d8d0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
d8e0: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
d8f0: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
d900: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
d910: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
d920: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
d930: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
d940: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
d950: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
d960: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
d970: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
d980: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
d990: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
d9a0: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
d9b0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
d9c0: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
d9d0: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
d9e0: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
d9f0: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
da00: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
da10: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
da20: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
da30: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
da40: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
da50: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
da60: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
da70: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
da80: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
da90: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
daa0: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
dab0: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
dac0: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
dad0: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
dae0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
daf0: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
db00: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
db10: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
db20: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
db30: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
db40: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
db50: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
db60: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
db70: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
db80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
db90: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
dba0: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
dbb0: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
dbc0: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
dbd0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
dbe0: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
dbf0: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
dc00: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
dc10: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
dc20: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
dc30: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
dc40: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
dc50: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
dc60: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
dc70: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
dc80: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
dc90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
dca0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
dcb0: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
dcc0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
dcd0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
dce0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
dcf0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
dd00: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
dd10: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
dd20: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
dd30: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
dd40: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
dd50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dd60: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
dd70: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
dd80: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
dd90: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
dda0: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
ddb0: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
ddc0: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
ddd0: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
dde0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
ddf0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
de00: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
de10: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
de20: 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
de30: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
de40: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
de50: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
de60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
de70: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
de80: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
de90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
dea0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
deb0: 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
dec0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
ded0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
dee0: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
def0: 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
df00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
df10: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
df20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
df30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
df40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df50: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
df60: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
df70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
df80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
df90: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
dfa0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
dfb0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
dfc0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
dfd0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
dfe0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
dff0: 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ST.      || (pPa
e000: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
e010: 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  de && pPager->jo
e020: 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
e030: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
e040: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
e050: 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  c = zeroJournalH
e060: 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61  dr(pPager, hasMa
e070: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67  ster);.      pag
e080: 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
e090: 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67   rc);.      pPag
e0a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
e0b0: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
e0c0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
e0d0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
e0e0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
e0f0: 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65  ranch may be exe
e100: 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72  cuted with Pager
e110: 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45  .journalMode==ME
e120: 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a  MORY if.      **
e130: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
e140: 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62  as just rolled b
e150: 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
e160: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  e the journal.  
e170: 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75      ** file shou
e180: 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ld be closed and
e190: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69   deleted. If thi
e1a0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
e1b0: 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  tes to.      ** 
e1c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e1d0: 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f  e, it will do so
e1e0: 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d   using an in-mem
e1f0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20  ory journal. .  
e200: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
e210: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
e220: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
e230: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
e240: 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  TE .           |
e250: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
e260: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e270: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
e280: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
e290: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
e2a0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
e2b0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
e2c0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
e2d0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
e2e0: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
e2f0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
e300: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
e310: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
e320: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
e330: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
e340: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
e350: 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
e360: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
e370: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
e380: 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
e390: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
e3a0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
e3b0: 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  h);.#endif.  }. 
e3c0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
e3d0: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
e3e0: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
e3f0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
e400: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
e410: 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Rec = 0;.  sqlit
e420: 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
e430: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
e440: 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
e450: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
e460: 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
e470: 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61  e3WalEndWriteTra
e480: 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
e490: 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65  >pWal);.    asse
e4a0: 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  rt( rc2==SQLITE_
e4b0: 4f 4b 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OK );.    pPager
e4c0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
e4d0: 53 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20  SHARED;..    /* 
e4e0: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
e4f0: 6e 20 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67  n was in locking
e500: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
e510: 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c  mode but is no l
e520: 6f 6e 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72  onger,.    ** dr
e530: 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  op the EXCLUSIVE
e540: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
e550: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
e560: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e570: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
e580: 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65  veMode && sqlite
e590: 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
e5a0: 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
e5b0: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20  0) ){.      rc2 
e5c0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
e5d0: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
e5e0: 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  CK);.    }.  }el
e5f0: 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
e600: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
e610: 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
e620: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
e630: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
e640: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e650: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
e660: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
e670: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
e680: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
e690: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
e6a0: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
e6b0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e6c0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
e6d0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
e6e0: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
e6f0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
e700: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e710: 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a  dbModified = 0;.
e720: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74  .  /* TODO: Is t
e730: 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79  his optimal? Why
e740: 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20   is the db size 
e750: 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65  invalidated here
e760: 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20   .  ** when the 
e770: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
e780: 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a   not unlocked? *
e790: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  /.  pPager->dbOr
e7a0: 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71  igSize = 0;.  sq
e7b0: 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
e7c0: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
e7d0: 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
e7e0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d  ize);.  if( !MEM
e7f0: 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
e800: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
e810: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
e820: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
e830: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
e840: 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
e850: 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
e860: 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
e870: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
e880: 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
e890: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
e8a0: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
e8b0: 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
e8c0: 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
e8d0: 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
e8e0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
e8f0: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
e900: 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
e910: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
e920: 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
e930: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
e940: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
e950: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
e960: 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
e970: 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
e980: 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
e990: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
e9a0: 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
e9b0: 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
e9c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
e9d0: 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
e9e0: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
e9f0: 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
ea00: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
ea10: 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
ea20: 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
ea30: 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
ea40: 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
ea50: 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
ea60: 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
ea70: 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
ea80: 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
ea90: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
eaa0: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
eab0: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
eac0: 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
ead0: 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
eae0: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
eaf0: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
eb00: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
eb10: 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
eb20: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
eb30: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
eb40: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
eb50: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
eb60: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
eb70: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
eb80: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
eb90: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
eba0: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
ebb0: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
ebc0: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
ebd0: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
ebe0: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
ebf0: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
ec00: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
ec10: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
ec20: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
ec30: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
ec40: 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
ec50: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
ec60: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
ec70: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
ec80: 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
ec90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
eca0: 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
ecb0: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
ecc0: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
ecd0: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
ece0: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
ecf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
ed00: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
ed10: 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
ed20: 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
ed30: 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
ed40: 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
ed50: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
ed60: 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
ed70: 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
ed80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ed90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
eda0: 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
edb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
edc0: 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
edd0: 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
ede0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee00: 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
ee10: 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
ee20: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
ee30: 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
ee40: 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
ee50: 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
ee60: 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
ee70: 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c */.#endif../*.
ee80: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
ee90: 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
eea0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
eeb0: 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
eec0: 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
eed0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
eee0: 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
eef0: 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
ef00: 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
ef10: 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
ef20: 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
ef30: 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
ef40: 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
ef50: 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
ef60: 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
ef70: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
ef80: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
ef90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61  ..**.** The isMa
efa0: 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74  inJrnl flag is t
efb0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74  rue if this is t
efc0: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
efd0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
efe0: 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74  false for the st
eff0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
f000: 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62    The main rollb
f010: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
f020: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  .** checksums - 
f030: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
f040: 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a  urnal does not..
f050: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
f060: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
f070: 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
f080: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
f090: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
f0a0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
f0b0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
f0c0: 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
f0d0: 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
f0e0: 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
f0f0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
f100: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
f110: 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
f120: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
f130: 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
f140: 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
f150: 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
f160: 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
f170: 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
f180: 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
f190: 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
f1a0: 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
f1b0: 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
f1c0: 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
f1d0: 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
f1e0: 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
f1f0: 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
f200: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
f210: 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
f220: 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
f230: 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
f240: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
f250: 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
f260: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
f270: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
f280: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
f290: 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
f2a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
f2b0: 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
f2c0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
f2d0: 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
f2e0: 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
f2f0: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
f300: 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
f310: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
f320: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
f330: 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
f340: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
f350: 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
f360: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
f370: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
f380: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
f390: 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
f3a0: 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
f3b0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
f3c0: 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
f3d0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
f3e0: 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
f3f0: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
f400: 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
f410: 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
f420: 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
f430: 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
f440: 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
f450: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
f460: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
f470: 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
f480: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
f490: 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
f4a0: 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
f4b0: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
f4c0: 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
f4d0: 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
f4e0: 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
f4f0: 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
f500: 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
f510: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
f520: 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
f530: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
f540: 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
f550: 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
f560: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
f570: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
f580: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
f590: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
f5a0: 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
f5b0: 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
f5c0: 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
f5d0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
f5e0: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
f5f0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
f600: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f620: 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
f630: 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
f640: 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20  i64 *pOffset,   
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f660: 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72   Offset of recor
f670: 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f  d to playback */
f680: 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
f690: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f6a0: 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
f6b0: 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
f6c0: 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
f6d0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
f6e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
f6f0: 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
f700: 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
f710: 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  l. */.  int isSa
f720: 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20  vepnt           
f730: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
f740: 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
f750: 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  llback */.){.  i
f760: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
f770: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
f780: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
f790: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
f7a0: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
f7b0: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
f7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f7d0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
f7e0: 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
f7f0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
f800: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
f810: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
f820: 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
f830: 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
f840: 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20  char *aData;    
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f860: 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   Temporary stora
f870: 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ge for the page 
f880: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
f890: 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  e *jfd;         
f8a0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
f8b0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
f8c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
f8d0: 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64  /.  int isSynced
f8e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f8f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
f900: 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e  rnal page is syn
f910: 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ced */..  assert
f920: 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31  ( (isMainJrnl&~1
f930: 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  )==0 );      /* 
f940: 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20  isMainJrnl is 0 
f950: 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
f960: 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29  ( (isSavepnt&~1)
f970: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  ==0 );       /* 
f980: 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f  isSavepnt is 0 o
f990: 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
f9a0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70   isMainJrnl || p
f9b0: 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70  Done );     /* p
f9c0: 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64  Done always used
f9d0: 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73   on sub-journals
f9e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
f9f0: 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65  Savepnt || pDone
fa00: 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e  ==0 );   /* pDon
fa10: 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20  e never used on 
fa20: 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f  non-savepoint */
fa30: 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67  ..  aData = pPag
fa40: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
fa50: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
fa60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
fa70: 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
fa80: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
fa90: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
faa0: 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
fab0: 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
fac0: 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  | (!isMainJrnl &
fad0: 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a  & isSavepnt) );.
fae0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
faf0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
fb00: 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
fb10: 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
fb20: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
fb30: 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
fb40: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
fb50: 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
fb60: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
fb70: 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
fb80: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
fb90: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
fba0: 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
fbb0: 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
fbc0: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
fbd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
fbe0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
fbf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
fc00: 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61  ad(jfd, (u8*)aDa
fc10: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
fc20: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
fc30: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
fc40: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
fc50: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
fc60: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
fc70: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
fc80: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
fc90: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
fca0: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
fcb0: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
fcc0: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
fcd0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
fce0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
fcf0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
fd00: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
fd10: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
fd20: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
fd30: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
fd40: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
fd50: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
fd60: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
fd70: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
fd80: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
fd90: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
fda0: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
fdb0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
fdc0: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
fdd0: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
fde0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
fdf0: 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
fe00: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
fe10: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
fe20: 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
fe30: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
fe40: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
fe50: 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
fe60: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
fe70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
fe80: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
fe90: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
fea0: 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
feb0: 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
fec0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
fed0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
fee0: 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
fef0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
ff00: 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ger, (u8*)aData)
ff10: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
ff20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
ff30: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
ff40: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
ff50: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
ff60: 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65 66  en played by bef
ff70: 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ore during the c
ff80: 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  urrent.  ** roll
ff90: 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74  back, then don't
ffa0: 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20   bother to play 
ffb0: 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20  it back again.. 
ffc0: 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   */.  if( pDone 
ffd0: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
ffe0: 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
fff0: 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
10000 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
10010 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
10020 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
10030 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
10040 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
10050 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
10060 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  VE );..  /* When
10070 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
10080 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
10090 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
100a0 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
100b0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
100c0 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
100d0 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
100e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
100f0 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
10100 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
10110 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
10120 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
10130 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
10140 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
10150 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
10160 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
10170 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
10180 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
10190 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
101a0 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
101b0 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
101c0 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
101d0 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
101e0 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
101f0 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
10200 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
10210 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
10220 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
10230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
10240 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
10250 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
10260 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
10270 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
10280 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
10290 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
102a0 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
102b0 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
102c0 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
102d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
102e0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
102f0 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
10300 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
10310 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
10320 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
10330 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
10340 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
10350 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
10360 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
10370 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
10380 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
10390 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
103a0 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
103b0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
103c0 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
103d0 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
103e0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
103f0 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
10400 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
10410 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
10420 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
10430 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
10440 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
10450 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
10460 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
10470 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
10480 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
10490 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
104a0 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
104b0 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
104c0 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
104d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
104e0 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
104f0 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
10500 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
10510 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
10520 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
10530 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
10540 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
10550 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
10560 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
10570 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
10580 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
10590 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
105a0 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
105b0 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
105c0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
105d0 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
105e0 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
105f0 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
10600 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
10610 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
10620 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
10630 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
10640 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
10650 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
10660 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
10670 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
10680 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
10690 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
106a0 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
106b0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
106c0 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
106d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
106e0 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
106f0 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
10700 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
10710 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
10720 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
10730 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
10740 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
10750 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
10760 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
10770 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
10780 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
10790 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
107a0 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
107b0 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
107c0 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
107d0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
107e0 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
107f0 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
10800 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
10810 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
10820 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
10830 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
10840 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
10850 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
10860 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
10870 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
10880 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  */.  if( pagerUs
10890 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
108a0 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d      pPg = 0;.  }
108b0 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20  else{.    pPg = 
108c0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
108d0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
108e0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
108f0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47   !MEMDB );.  PAG
10900 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
10910 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
10920 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
10930 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
10940 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
10950 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
10960 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
10970 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a  e, (u8*)aData),.
10980 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
10990 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
109a0 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
109b0 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
109c0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
109d0 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50     isSynced = pP
109e0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
109f0 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61  (*pOffset <= pPa
10a00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
10a10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
10a20 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d  sSynced = (pPg==
10a30 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
10a40 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
10a50 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69  _SYNC));.  }.  i
10a60 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  f( (pPager->stat
10a70 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
10a80 56 45 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e  VE).   && isOpen
10a90 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
10aa0 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
10ab0 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
10ac0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
10ad0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
10ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
10af0 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
10b00 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
10b10 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
10b20 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
10b30 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
10b40 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
10b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
10b60 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
10b70 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
10b80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
10b90 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
10ba0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
10bb0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
10bc0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
10bd0 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
10be0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10bf0 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
10c00 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
10c10 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
10c20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
10c30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
10c40 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
10c50 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
10c60 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
10c70 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
10c80 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
10c90 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
10ca0 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
10cb0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
10cc0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
10cd0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
10ce0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
10cf0 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
10d00 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
10d10 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
10d20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
10d30 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
10d40 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
10d50 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
10d60 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
10d70 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
10d80 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
10d90 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
10da0 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
10db0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
10dc0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
10dd0 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
10de0 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
10df0 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
10e00 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
10e10 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
10e20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
10e30 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
10e40 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
10e50 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
10e60 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
10e70 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
10e80 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
10e90 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
10ea0 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
10eb0 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
10ec0 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
10ed0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
10ee0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
10ef0 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
10f00 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
10f10 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
10f20 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
10f30 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
10f40 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
10f50 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
10f60 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
10f70 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
10f80 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
10f90 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
10fa0 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
10fb0 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
10fc0 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
10fd0 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
10fe0 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
10ff0 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
11000 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
11010 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
11020 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
11030 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
11040 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11050 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
11060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11070 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29  >doNotSpill==0 )
11080 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
11090 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20  NotSpill++;.    
110a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
110b0 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
110c0 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
110d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
110e0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d  ger->doNotSpill=
110f0 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
11100 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a  ->doNotSpill--;.
11110 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11120 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
11130 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
11140 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
11150 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
11160 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
11170 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
11180 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
11190 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
111a0 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
111b0 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
111c0 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
111d0 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
111e0 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
111f0 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
11200 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
11210 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
11220 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
11230 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
11240 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
11250 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
11260 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
11270 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
11280 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
11290 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
112a0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
112b0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
112c0 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
112d0 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
112e0 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
112f0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
11300 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
11310 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
11320 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
11330 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
11340 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
11350 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
11360 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
11370 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
11380 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
11390 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
113a0 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
113b0 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
113c0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
113d0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
113e0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
113f0 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
11400 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
11410 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
11420 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
11430 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
11440 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
11450 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
11460 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
11470 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
11480 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
11490 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
114a0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
114b0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
114c0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
114d0 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
114e0 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
114f0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
11500 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
11510 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
11520 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
11530 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
11540 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
11550 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
11560 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
11570 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
11580 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
11590 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
115a0 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
115b0 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
115c0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
115d0 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
115e0 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
115f0 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
11600 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
11610 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
11620 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
11630 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
11640 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
11650 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
11660 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
11670 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
11680 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
11690 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
116a0 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
116b0 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
116c0 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
116d0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
116e0 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
116f0 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
11700 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
11710 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
11720 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
11730 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
11740 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
11750 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
11760 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
11770 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
11780 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
11790 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
117a0 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
117b0 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
117c0 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
117d0 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
117e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
117f0 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
11800 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
11810 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
11820 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
11830 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
11840 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
11850 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  Pg);.    }.#ifde
11860 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
11870 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
11880 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
11890 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
118a0 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
118b0 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
118c0 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
118d0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
118e0 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
118f0 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
11900 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
11910 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
11920 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
11930 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
11940 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
11950 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
11960 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
11970 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
11980 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
11990 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
119a0 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
119b0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
119c0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
119d0 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
119e0 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
119f0 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
11a00 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
11a10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
11a20 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
11a30 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
11a40 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
11a50 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
11a60 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
11a70 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
11a80 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11a90 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
11aa0 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
11ab0 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
11ac0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
11ad0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
11ae0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
11af0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
11b00 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
11b10 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
11b20 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
11b30 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
11b40 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
11b50 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
11b60 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
11b70 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
11b80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
11b90 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
11ba0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11bb0 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
11bc0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
11bd0 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
11be0 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
11bf0 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
11c00 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
11c10 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
11c20 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
11c30 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
11c40 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
11c50 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
11c60 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
11c70 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
11c80 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
11c90 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
11ca0 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
11cb0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
11cc0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
11cd0 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
11ce0 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
11cf0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
11d00 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
11d10 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
11d20 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
11d30 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
11d40 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11d50 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
11d60 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
11d70 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
11d80 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
11d90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
11da0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11db0 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
11dc0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
11dd0 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
11de0 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
11df0 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
11e00 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
11e10 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
11e20 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
11e30 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
11e40 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
11e50 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
11e60 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
11e70 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
11e80 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
11e90 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
11ea0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
11eb0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11ec0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
11ed0 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
11ee0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
11ef0 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
11f00 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
11f10 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
11f20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
11f30 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
11f40 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
11f50 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
11f60 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
11f70 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
11f80 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
11f90 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
11fa0 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
11fb0 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
11fc0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11fd0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
11fe0 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
11ff0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
12000 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
12010 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
12020 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
12030 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
12040 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
12050 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
12060 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
12070 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
12080 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
12090 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
120a0 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
120b0 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
120c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
120d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
120e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
120f0 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
12100 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
12110 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
12120 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
12130 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
12140 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
12150 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
12160 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
12170 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
12180 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
12190 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
121a0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
121b0 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
121c0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
121d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
121e0 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
121f0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
12200 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
12210 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12220 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
12230 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
12240 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
12250 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
12260 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
12270 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12280 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
12290 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
122a0 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
122b0 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
122c0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
122d0 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
122e0 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
122f0 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
12300 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
12310 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
12320 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
12330 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
12340 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
12350 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
12360 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12370 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
12380 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
12390 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
123a0 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
123b0 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
123c0 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
123d0 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
123e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
123f0 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
12400 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
12410 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
12420 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
12430 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
12440 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
12450 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
12460 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
12470 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
12480 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
12490 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
124a0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
124b0 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
124c0 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
124d0 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
124e0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
124f0 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
12500 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
12510 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
12520 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
12530 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
12540 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
12550 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12560 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
12570 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
12580 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
12590 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
125a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
125b0 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
125c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
125d0 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
125e0 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
125f0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
12600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12610 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
12620 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ut;..  /* Load t
12630 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
12640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
12650 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
12660 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  d from.  ** sqli
12670 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
12680 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
12690 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20  MasterJournal.  
126a0 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a   Also obtain.  *
126b0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  * sufficient spa
126c0 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74  ce (in zMasterPt
126d0 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  r) to hold the n
126e0 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20  ames of master. 
126f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
12700 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
12710 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63   regular rollbac
12720 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  k-journals..  */
12730 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
12740 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
12750 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
12760 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
12770 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
12780 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
12790 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
127a0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
127b0 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
127c0 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
127d0 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  oc((int)nMasterJ
127e0 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
127f0 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20  Ptr + 1);.  if( 
12800 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
12810 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12820 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
12830 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
12840 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50  ;.  }.  zMasterP
12850 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
12860 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
12870 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73  nal+1];.  rc = s
12880 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
12890 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
128a0 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74  rnal, (int)nMast
128b0 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
128c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
128d0 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
128e0 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74  ter_out;.  zMast
128f0 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
12900 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a  rJournal] = 0;..
12910 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
12920 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77  sterJournal;.  w
12930 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
12940 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
12950 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
12960 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73  {.    int exists
12970 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12980 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
12990 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
129a0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
129b0 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69   &exists);.    i
129c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
129d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64   ){.      goto d
129e0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
129f0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73    }.    if( exis
12a00 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ts ){.      /* O
12a10 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
12a20 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
12a30 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12a40 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
12a50 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
12a60 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
12a70 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
12a80 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
12a90 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
12aa0 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
12ab0 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
12ac0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
12ad0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63    */.      int c
12ae0 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
12af0 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
12b00 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
12b10 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
12b20 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  AL);.      rc = 
12b30 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
12b40 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
12b50 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
12b60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
12b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12b80 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
12b90 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
12ba0 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  }..      rc = re
12bb0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
12bc0 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
12bd0 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
12be0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12bf0 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
12c00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
12c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12c20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
12c30 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
12c40 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  }..      c = zMa
12c50 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
12c60 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
12c70 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
12c80 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a  .      if( c ){.
12c90 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
12ca0 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
12cb0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
12cc0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12cd0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  e. */.        go
12ce0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
12cf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12d00 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
12d10 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
12d20 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
12d30 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73   }. .  sqlite3Os
12d40 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
12d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12d60 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
12d70 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
12d80 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  ster_out:.  sqli
12d90 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
12da0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
12db0 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
12dc0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
12dd0 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
12de0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
12df0 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c  rnal) );.    sql
12e00 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
12e10 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
12e20 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
12e30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12e40 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
12e50 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
12e60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
12e70 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
12e80 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
12e90 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
12ea0 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
12eb0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
12ec0 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
12ed0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
12ee0 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
12ef0 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
12f00 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
12f10 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
12f20 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
12f30 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  n, or an exclusi
12f40 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a  ve lock is not.*
12f50 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  * held, this fun
12f60 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
12f70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
12f80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
12f90 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20  e is.** changed 
12fa0 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
12fb0 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
12fc0 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49  geSize bytes). I
12fd0 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e  f the file.** on
12fe0 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
12ff0 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
13000 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
13010 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
13020 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
13030 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
13040 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
13050 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  might might be t
13060 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
13070 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
13080 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
13090 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
130a0 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
130b0 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
130c0 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
130d0 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
130e0 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
130f0 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
13100 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
13110 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
13120 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
13130 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
13140 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
13150 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
13160 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
13170 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
13180 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
13190 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
131a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
131b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
131c0 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
131d0 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
131e0 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
131f0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
13200 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
13210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
13220 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
13230 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
13240 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
13250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13260 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
13270 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
13280 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  VE && isOpen(pPa
13290 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
132a0 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
132b0 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a   newSize;.    /*
132c0 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66   TODO: Is it saf
132d0 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64  e to use Pager.d
132e0 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20  bFileSize here? 
132f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
13300 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
13310 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
13320 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
13330 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
13340 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61  ageSize*(i64)nPa
13350 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
13360 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
13370 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
13380 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
13390 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
133a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
133b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
133c0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
133d0 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
133e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
133f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
13400 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
13410 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31  "", 1, newSize-1
13420 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13430 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
13450 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
13460 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
13470 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
13480 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13490 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
134a0 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63  of the Pager.sec
134b0 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
134c0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
134d0 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e  * pager based on
134e0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
134f0 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
13500 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a  orSize method.**
13510 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74   of the open dat
13520 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
13530 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
13540 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a   be used used .*
13550 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  * to determine t
13560 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67  he size and alig
13570 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  nment of journal
13580 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20   header and .** 
13590 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
135a0 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63  ointers within c
135b0 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  reated journal f
135c0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iles..**.** For 
135d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
135e0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
135f0 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77  ctor size is alw
13600 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a  ays 512 bytes..*
13610 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
13620 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72  for non-temporar
13630 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66  y files, the eff
13640 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
13650 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c  ze is.** the val
13660 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
13670 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29  he xSectorSize()
13680 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20   method rounded 
13690 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69  up to 32 if.** i
136a0 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33  t is less than 3
136b0 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f  2, or rounded do
136c0 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52  wn to MAX_SECTOR
136d0 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69  _SIZE if it.** i
136e0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d  s greater than M
136f0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
13700 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
13710 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
13720 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
13730 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
13740 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
13750 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
13760 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
13770 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
13780 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
13790 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
137a0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
137b0 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
137c0 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
137d0 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
137e0 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68  ed yet, in which
137f0 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
13800 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
13810 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
13820 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
13830 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
13840 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
13850 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
13860 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
13870 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
13880 65 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67  e<32 ){.    pPag
13890 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
138a0 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20   512;.  }.  if( 
138b0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
138c0 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
138d0 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE ){.    assert
138e0 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  ( MAX_SECTOR_SIZ
138f0 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50  E>=512 );.    pP
13900 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
13910 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
13920 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ZE;.  }.}../*.**
13930 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
13940 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
13950 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
13960 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
13970 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
13980 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
13990 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
139a0 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
139b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
139c0 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
139d0 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
139e0 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
139f0 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
13a00 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
13a10 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
13a20 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
13a30 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
13a40 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
13a50 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
13a60 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
13a70 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
13a80 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
13a90 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
13aa0 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
13ab0 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
13ac0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
13ad0 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
13ae0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
13af0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
13b00 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
13b10 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
13b20 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
13b30 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
13b40 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
13b50 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
13b60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
13b70 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
13b80 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
13b90 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
13ba0 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
13bb0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
13bc0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
13bd0 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
13be0 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
13bf0 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
13c00 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
13c10 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
13c20 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
13c30 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
13c40 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
13c50 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64  *  (7)  zero pad
13c60 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20  ding out to the 
13c70 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65  next sector size
13c80 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20  ..**  (8)  Zero 
13c90 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
13ca0 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
13cb0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
13cc0 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
13cd0 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
13ce0 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
13cf0 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
13d00 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
13d10 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
13d20 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
13d30 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
13d40 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
13d50 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
13d60 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 7 items above.
13d70 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
13d80 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
13d90 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
13da0 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 8th item..**
13db0 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
13dc0 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
13dd0 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
13de0 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
13df0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
13e00 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
13e10 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
13e20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
13e30 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
13e40 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
13e50 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
13e60 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
13e70 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
13e80 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
13e90 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
13ea0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
13eb0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
13ec0 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
13ed0 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
13ee0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
13ef0 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
13f00 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
13f10 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
13f20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
13f30 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
13f40 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
13f50 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
13f60 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
13f70 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
13f80 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
13f90 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
13fa0 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
13fb0 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
13fc0 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
13fd0 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
13fe0 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
13ff0 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
14000 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
14010 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
14020 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
14030 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
14040 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
14050 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
14060 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
14070 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
14080 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
14090 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
140a0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
140b0 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
140c0 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
140d0 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
140e0 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
140f0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
14100 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
14110 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
14120 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
14130 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
14140 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
14150 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
14160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14170 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
14180 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
14190 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
141a0 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
141b0 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
141c0 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
141d0 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
141e0 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
141f0 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
14200 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
14210 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
14220 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
14230 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
14240 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
14250 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
14260 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
14270 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
14280 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
14290 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
142a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
142b0 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
142c0 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
142d0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
142e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
142f0 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
14300 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
14310 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
14320 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
14330 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
14340 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
14350 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
14360 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
14370 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
14380 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
14390 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
143a0 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
143b0 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
143c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
143d0 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
143e0 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
143f0 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
14400 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
14410 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
14420 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
14430 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
14440 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
14450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14460 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
14470 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
14480 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
14490 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
144a0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
144b0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
144c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
144d0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
144e0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
144f0 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
14500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14510 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
14520 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
14530 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14550 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
14560 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
14570 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
14580 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
14590 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
145a0 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
145b0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
145c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
145d0 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
145e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
145f0 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
14600 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
14610 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
14620 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
14630 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
14640 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
14650 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
14660 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
14670 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
14680 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
14690 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
146a0 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
146b0 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
146c0 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  k */..  /* Figur
146d0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
146e0 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
146f0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
14700 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
14710 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
14720 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
14730 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
14740 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
14750 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
14760 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
14770 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
14780 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
14790 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  szJ==0 ){.    go
147a0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
147b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
147c0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
147d0 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
147e0 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
147f0 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
14800 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
14810 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
14820 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
14830 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
14840 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
14850 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
14860 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
14870 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
14880 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
14890 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
148a0 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
148b0 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
148c0 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
148d0 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
148e0 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
148f0 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
14900 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
14910 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
14920 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
14930 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
14940 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
14950 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
14960 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
14970 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
14980 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20    mxPathname is 
14990 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
149a0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
149b0 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
149c0 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
149d0 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
149e0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
149f0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
14a00 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
14a10 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
14a20 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
14a30 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
14a40 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
14a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14a60 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
14a70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14a80 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
14a90 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
14aa0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
14ab0 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
14ac0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
14ad0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
14ae0 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
14af0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
14b00 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14b10 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
14b20 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
14b30 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
14b40 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
14b50 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
14b60 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
14b70 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
14b80 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
14b90 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
14ba0 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
14bb0 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
14bc0 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
14bd0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f  hile( 1 ){.    /
14be0 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
14bf0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
14c00 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
14c10 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
14c20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
14c30 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
14c40 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
14c50 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
14c60 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
14c70 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
14c80 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
14c90 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
14ca0 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
14cb0 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
14cc0 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
14cd0 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
14ce0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
14cf0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
14d00 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
14d10 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c  r(pPager, isHot,
14d20 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
14d30 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
14d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
14d50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14d60 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
14d70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14d80 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
14d90 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
14da0 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
14db0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
14dc0 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
14dd0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
14de0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
14df0 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
14e00 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
14e10 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
14e20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
14e30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
14e40 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
14e50 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
14e60 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
14e70 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
14e80 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
14e90 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
14ea0 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
14eb0 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
14ec0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
14ed0 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
14ee0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
14ef0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
14f00 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
14f10 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
14f20 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
14f30 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
14f40 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
14f50 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
14f60 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
14f70 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
14f80 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
14f90 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
14fa0 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
14fb0 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
14fc0 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
14fd0 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
14fe0 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
14ff0 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
15000 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
15010 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
15020 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
15030 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
15040 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
15050 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
15060 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
15070 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15080 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
15090 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
150a0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
150b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
150c0 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
150d0 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
150e0 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
150f0 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57   #2565..    ** W
15100 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
15110 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20   a hot journal, 
15120 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d  nRec==0 always m
15130 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
15140 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20  xt.    ** chunk 
15150 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  of the journal c
15160 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67  ontains zero pag
15170 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  es to be rolled 
15180 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  back.  But.    *
15190 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52  * when doing a R
151a0 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20  OLLBACK and the 
151b0 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73  nRec==0 chunk is
151c0 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20   the last chunk 
151d0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
151e0 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20  urnal, it means 
151f0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
15200 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
15210 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a  dditional.    **
15220 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
15230 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
15240 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
15250 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15260 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  .    ** should b
15270 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64  e computed based
15280 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
15290 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  file size..    *
152a0 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
152b0 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
152c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
152d0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
152e0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
152f0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
15300 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
15310 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
15320 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
15330 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
15340 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
15350 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
15360 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
15370 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
15380 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
15390 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
153a0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
153b0 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
153c0 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
153d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
153e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
153f0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
15400 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
15410 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
15420 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
15430 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
15440 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15450 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
15460 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
15470 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
15480 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
15490 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
154a0 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
154b0 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
154c0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
154d0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
154e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
154f0 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
15500 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
15510 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
15520 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
15530 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
15540 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
15550 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
15560 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
15570 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
15580 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
15590 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
155a0 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d  (pPager,&pPager-
155b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c  >journalOff,0,1,
155c0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
155d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
155e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
155f0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
15600 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
15610 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
15620 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15630 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
15640 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15650 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
15660 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
15670 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
15680 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
15690 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
156a0 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
156b0 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
156c0 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
156d0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
156e0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
156f0 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
15700 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
15710 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
15720 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
15730 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
15740 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
15750 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
15760 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
15770 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
15780 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
15790 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
157a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
157b0 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
157c0 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
157d0 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
157e0 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
157f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
15800 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
15810 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
15820 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15830 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
15840 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
15850 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
15860 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
15870 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
15880 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
15890 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
158a0 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
158b0 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
158c0 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
158d0 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
158e0 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
158f0 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
15900 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
15910 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
15920 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
15930 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
15940 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
15950 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
15960 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
15970 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
15980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
15990 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
159a0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
159b0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
159c0 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
159d0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
159e0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
159f0 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
15a00 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
15a10 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
15a20 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
15a30 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
15a40 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
15a50 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
15a60 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
15a70 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
15a80 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
15a90 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
15aa0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15ab0 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
15ac0 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  fied..  */.  ass
15ad0 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d  ert(.    pPager-
15ae0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30  >fd->pMethods==0
15af0 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ||.    sqlite3O
15b00 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
15b10 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46  ger->fd,SQLITE_F
15b20 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
15b30 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a  D,0)>=SQLITE_OK.
15b40 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68    );..  /* If th
15b50 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
15b60 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
15b70 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
15b80 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
15b90 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
15ba0 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
15bb0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
15bc0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
15bd0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
15be0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
15bf0 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
15c00 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
15c10 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
15c20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
15c30 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
15c40 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
15c50 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
15c60 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
15c70 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
15c80 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
15c90 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
15ca0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
15cb0 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
15cc0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
15cd0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
15ce0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
15cf0 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
15d00 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
15d10 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
15d20 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
15d30 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
15d40 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
15d50 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
15d60 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
15d70 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
15d80 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
15d90 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
15da0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
15db0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
15dc0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
15dd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
15de0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
15df0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
15e00 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
15e10 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
15e20 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
15e30 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
15e40 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
15e50 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
15e60 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
15e70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15e80 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
15e90 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
15ea0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
15eb0 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72  CLUSIVE ){.    r
15ec0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
15ed0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
15ee0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
15ef0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
15f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
15f10 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
15f20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
15f30 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
15f40 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  E ){.    rc = sq
15f50 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
15f60 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
15f70 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d  sync_flags);.  }
15f80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15f90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
15fa0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
15fb0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
15fc0 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
15fd0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
15fe0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
15ff0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
16000 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
16010 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
16020 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
16030 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
16040 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
16050 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
16060 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
16070 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
16080 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
16090 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
160a0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
160b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
160c0 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
160d0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
160e0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
160f0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
16100 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
16110 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
16120 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
16130 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
16140 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
16150 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
16160 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
16170 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
16180 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
16190 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
161a0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
161b0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
161c0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
161d0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
161e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
161f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
16200 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
16210 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
16220 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16230 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
16240 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
16250 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
16260 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
16270 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
16280 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
16290 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
162a0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
162b0 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
162c0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
162d0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
162e0 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
162f0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
16300 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
16310 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
16320 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
16330 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
16340 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
16350 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
16360 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
16370 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
16380 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
16390 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
163a0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
163b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
163c0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
163d0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
163e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
163f0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
16400 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
16410 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
16420 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
16430 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
16440 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
16450 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16460 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57  e */.  int isInW
16470 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  al = 0;         
16480 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
16490 61 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69  age is in log fi
164a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a  le */.  int pgsz
164b0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
164c0 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ize; /* Number o
164d0 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20  f bytes to read 
164e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
164f0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
16500 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45  ER_SHARED && !ME
16510 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
16520 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
16530 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
16540 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
16550 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
16560 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16570 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
16580 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
16590 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
165a0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
165b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
165c0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
165d0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
165e0 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70  .    /* Try to p
165f0 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f  ull the page fro
16600 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  m the write-ahea
16610 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  d log. */.    rc
16620 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
16630 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  d(pPager->pWal, 
16640 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20  pgno, &isInWal, 
16650 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
16660 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
16670 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69  =SQLITE_OK && !i
16680 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36  sInWal ){.    i6
16690 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
166a0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
166b0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
166c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
166d0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
166e0 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
166f0 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
16700 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
16710 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
16720 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
16730 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
16740 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
16750 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
16760 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
16770 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
16780 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
16790 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
167a0 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
167b0 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
167c0 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
167d0 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
167e0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
167f0 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
16800 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
16810 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
16820 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
16830 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
16840 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
16850 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
16860 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
16870 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
16880 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
16890 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
168a0 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
168b0 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
168c0 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
168d0 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
168e0 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
168f0 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
16900 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
16910 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
16920 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
16930 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
16940 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
16950 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
16960 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
16970 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
16980 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
16990 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
169a0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
169b0 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
169c0 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36  sing equaling 16
169d0 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69   bytes of 0xff i
169e0 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  s vanishingly sm
169f0 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20  all so.      ** 
16a00 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  we should still 
16a10 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  be ok..      */.
16a20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
16a30 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
16a40 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50   0xff, sizeof(pP
16a50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
16a60 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
16a70 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56       u8 *dbFileV
16a80 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
16a90 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
16aa0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
16ab0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
16ac0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
16ad0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
16ae0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20  eVers));.    }. 
16af0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
16b00 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
16b10 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
16b20 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20  LITE_NOMEM);..  
16b30 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
16b40 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
16b50 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
16b60 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
16b70 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
16b80 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
16b90 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
16ba0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
16bb0 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
16bc0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
16be0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
16bf0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
16c00 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
16c10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
16c20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16c30 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
16c40 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
16c50 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
16c60 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
16c70 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
16c80 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
16c90 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
16ca0 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
16cb0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
16cc0 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
16cd0 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
16ce0 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
16cf0 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
16d00 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
16d10 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
16d20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
16d30 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
16d40 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
16d50 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
16d60 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
16d70 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
16d80 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
16d90 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
16da0 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
16db0 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
16dc0 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
16dd0 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
16de0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
16df0 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
16e00 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
16e10 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
16e20 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
16e30 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
16e40 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
16e50 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
16e60 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
16e70 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
16e80 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
16e90 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16ea0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
16eb0 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
16ec0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
16ed0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
16ee0 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
16ef0 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
16f00 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
16f10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
16f20 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
16f30 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
16f40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
16f50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
16f60 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
16f70 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
16f80 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
16f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
16fa0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
16fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
16fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16fd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
16fe0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
16ff0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17000 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
17010 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
17020 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  /* Normally, if 
17030 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
17040 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e   rolled back, an
17050 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  y backup process
17060 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61  es are.  ** upda
17070 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63  ted as data is c
17080 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
17090 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
170a0 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20  l and into the. 
170b0 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
170c0 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61  is is not genera
170d0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74  lly possible wit
170e0 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  h a WAL database
170f0 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  , as.  ** rollba
17100 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70  ck involves simp
17110 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  ly truncating th
17120 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72  e log file. Ther
17130 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20  efore, if one.  
17140 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65  ** or more frame
17150 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
17160 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
17170 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72  he log (and ther
17180 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f  efore .  ** also
17190 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
171a0 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65   backup database
171b0 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  s) as part of th
171c0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  is transaction,.
171d0 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73    ** the backups
171e0 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74   must be restart
171f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
17200 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
17210 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
17220 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
17230 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
17240 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
17250 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74   to rollback a t
17260 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20  ransaction on a 
17270 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  WAL database..*/
17280 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
17290 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67  rRollbackWal(Pag
172a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
172b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
172d0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
172e0 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b  .  PgHdr *pList;
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69     /* List of di
17310 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76  rty pages to rev
17320 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72  ert */..  /* For
17330 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
17340 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65  e cache that are
17350 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
17360 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79   or have already
17370 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  .  ** been writt
17380 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d  en (but not comm
17390 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f  itted) to the lo
173a0 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f  g file, do one o
173b0 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c  f the .  ** foll
173c0 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
173d0 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65     + Discard the
173e0 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66   cached page (if
173f0 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f   refcount==0), o
17400 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61  r.  **   + Reloa
17410 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66  d page content f
17420 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
17430 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29   (if refcount>0)
17440 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
17450 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
17460 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
17470 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55  rc = sqlite3WalU
17480 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
17490 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  , pagerUndoCallb
174a0 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  ack, (void *)pPa
174b0 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ger);.  pList = 
174c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
174d0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
174e0 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65  PCache);.  while
174f0 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53  ( pList && rc==S
17500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17510 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
17520 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
17530 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
17540 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a  Callback((void *
17550 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  )pPager, pList->
17560 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74  pgno);.    pList
17570 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20   = pNext;.  }.. 
17580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17590 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
175a0 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20  on is a wrapper 
175b0 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61  around sqlite3Wa
175c0 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65  lFrames(). As we
175d0 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a  ll as logging.**
175e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
175f0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
17600 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69  es headed by pLi
17610 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  st (connected by
17620 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69   pDirty),.** thi
17630 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66  s function notif
17640 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62  ies any active b
17650 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
17660 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68  that the pages h
17670 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20  ave.** changed. 
17680 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
17690 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a  pagerWalFrames(.
176a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
176b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176c0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
176d0 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  t */.  PgHdr *pL
176e0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
176f0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
17700 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20  f frames to log 
17710 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63  */.  Pgno nTrunc
17720 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
17730 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
17740 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73   size after this
17750 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
17760 20 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20   isCommit,      
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17780 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
17790 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e  a commit */.  in
177a0 74 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20  t sync_flags    
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
177c0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
177d0 6f 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30  o OsSync() (or 0
177e0 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
177f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
17810 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
17820 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
17830 57 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  Wal );.  rc = sq
17840 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70  lite3WalFrames(p
17850 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
17860 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
17870 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72  Size, pList, nTr
17880 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74  uncate, isCommit
17890 2c 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29  , sync_flags.  )
178a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
178b0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
178c0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
178d0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
178e0 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
178f0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
17900 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
17910 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
17920 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
17930 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
17940 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17950 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17960 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72   Begin a read tr
17970 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
17980 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   WAL..**.** This
17990 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f   routine used to
179a0 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65   be called "page
179b0 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22  rOpenSnapshot()"
179c0 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65   because it esse
179d0 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73  ntially.** makes
179e0 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74   a snapshot of t
179f0 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  he database at t
17a00 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74  he current point
17a10 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65   in time and pre
17a20 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73  serves.** that s
17a30 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20  napshot for use 
17a40 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e  by the reader in
17a50 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72   spite of concur
17a60 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62  rently changes b
17a70 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65  y.** other write
17a80 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  rs or checkpoint
17a90 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
17aa0 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  nt pagerBeginRea
17ab0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  dTransaction(Pag
17ac0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
17ad0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17af0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
17b00 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d  .  int changed =
17b10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17b20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
17b30 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65  che must be rese
17b40 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
17b50 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
17b60 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  er) );..  /* sql
17b70 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
17b80 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20  ansaction() was 
17b90 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  not called for t
17ba0 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a  he previous.  **
17bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
17bc0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
17bd0 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c  LUSIVE.  So call
17be0 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a   it now.  If we.
17bf0 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b    ** are in lock
17c00 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20  ing_mode=NORMAL 
17c10 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61  and EndRead() wa
17c20 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  s previously cal
17c30 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75  led,.  ** the du
17c40 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20  plicate call is 
17c50 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20  harmless..  */. 
17c60 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
17c70 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
17c80 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
17c90 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
17ca0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
17cb0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
17cc0 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69  , &changed);.  i
17cd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17ce0 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d   ){.    int dumm
17cf0 79 3b 0a 20 20 20 20 69 66 28 20 63 68 61 6e 67  y;.    if( chang
17d00 65 64 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  ed ){.      page
17d10 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
17d20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17d30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
17d40 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
17d50 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20  Valid==0 );.    
17d60 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
17d70 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
17d80 28 70 50 61 67 65 72 2c 20 26 64 75 6d 6d 79 29  (pPager, &dummy)
17d90 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
17da0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
17db0 41 52 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ARED;..  return 
17dc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
17dd0 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
17de0 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
17df0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
17e00 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
17e10 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
17e20 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
17e30 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72   is not empy, or
17e40 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
17e50 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
17e60 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62  .** not exist (b
17e70 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69  y deleting it) i
17e80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
17e90 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ile is empty..**
17ea0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
17eb0 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ase is not empty
17ec0 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66   and the *-wal f
17ed0 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e  ile exists, open
17ee0 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e   the pager.** in
17ef0 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74   WAL mode.  If t
17f00 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
17f10 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d  mpty or if no *-
17f20 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  wal file exists 
17f30 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72  and.** if no err
17f40 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20  or occurs, make 
17f50 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  sure Pager.journ
17f60 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65  alMode is not se
17f70 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f  t to.** PAGER_JO
17f80 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a  URNALMODE_WAL..*
17f90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
17fa0 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f  TE_OK or an erro
17fb0 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  r code..**.** If
17fc0 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 69 73   the WAL file is
17fd0 20 6f 70 65 6e 65 64 2c 20 61 6c 73 6f 20 6f 70   opened, also op
17fe0 65 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 28 72  en a snapshot (r
17ff0 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ead transaction)
18000 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
18010 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
18020 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
18030 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18040 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
18050 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
18060 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
18070 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
18080 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
18090 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
180a0 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
180b0 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
180c0 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
180d0 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
180e0 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
180f0 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
18100 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
18110 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
18120 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
18130 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
18140 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
18150 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
18160 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
18170 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
18180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
18190 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
181a0 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
181b0 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  isWal;          
181c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
181d0 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78  e if WAL file ex
181e0 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ists */.    int 
181f0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
18200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
18210 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18220 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 61 73  e file */.    as
18230 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
18240 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
18250 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
18260 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
18270 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
18280 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
18290 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
182a0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
182b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
182c0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
182d0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
182e0 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  >zWal, 0);.     
182f0 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20   isWal = 0;.    
18300 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
18310 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
18320 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  s(.          pPa
18330 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
18340 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f  r->zWal, SQLITE_
18350 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
18360 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20  isWal.      );. 
18370 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
18380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18390 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b      if( isWal ){
183a0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
183b0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
183c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
183d0 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
183e0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
183f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18410 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
18420 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
18430 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
18440 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
18450 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
18460 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
18470 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
18480 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
18490 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
184a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
184b0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
184c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
184d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
184e0 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
184f0 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
18500 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
18510 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
18520 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
18530 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
18540 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18550 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
18560 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
18570 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
18580 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
18590 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
185a0 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
185b0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
185c0 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
185d0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
185e0 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
185f0 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
18600 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
18610 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
18620 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
18630 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
18640 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
18650 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
18660 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
18670 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
18680 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
18690 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
186a0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
186b0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
186c0 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
186d0 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
186e0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
186f0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
18700 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
18710 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
18720 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
18730 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
18740 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
18750 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
18760 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
18770 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
18780 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
18790 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
187a0 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
187b0 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
187c0 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
187d0 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
187e0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
187f0 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
18800 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
18810 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
18820 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
18830 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
18840 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
18850 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
18860 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
18870 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
18880 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
18890 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
188a0 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
188b0 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
188c0 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
188d0 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
188e0 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
188f0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
18900 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
18910 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
18920 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
18930 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
18940 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
18950 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
18960 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
18970 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
18980 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
18990 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
189a0 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
189b0 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
189c0 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
189d0 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
189e0 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
189f0 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
18a00 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
18a10 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
18a20 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
18a30 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
18a40 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
18a50 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
18a60 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
18a70 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
18a80 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
18a90 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
18aa0 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
18ab0 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
18ac0 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
18ad0 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
18ae0 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
18af0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
18b00 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
18b10 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
18b20 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
18b30 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
18b40 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
18b50 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
18b60 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
18b70 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
18b80 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
18b90 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
18ba0 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
18bb0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
18bc0 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
18bd0 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
18be0 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
18bf0 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
18c00 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
18c30 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
18c40 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
18c50 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
18c60 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
18c70 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
18c80 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
18c90 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
18ca0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
18cb0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
18cc0 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
18cd0 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
18ce0 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
18cf0 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
18d00 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
18d10 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
18d20 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
18d30 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f  R_SHARED );..  /
18d40 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
18d50 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
18d60 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
18d70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
18d80 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
18d90 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
18da0 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
18db0 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
18dc0 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
18dd0 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
18de0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18df0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
18e00 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
18e10 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   database size b
18e20 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
18e30 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74   it was before t
18e40 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
18e50 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65  ** being reverte
18e60 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20  d was opened..  
18e70 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
18e80 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ize = pSavepoint
18e90 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   ? pSavepoint->n
18ea0 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64  Orig : pPager->d
18eb0 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 69 66  bOrigSize;..  if
18ec0 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26  ( !pSavepoint &&
18ed0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
18ee0 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
18ef0 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  rn pagerRollback
18f00 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Wal(pPager);.  }
18f10 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
18f20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
18f30 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
18f40 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
18f50 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
18f60 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
18f70 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
18f80 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
18f90 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
18fa0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
18fb0 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
18fc0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
18fd0 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
18fe0 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
18ff0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
19000 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
19010 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
19020 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19030 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ff;.  assert( pa
19040 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
19050 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  )==0 || szJ==0 )
19060 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
19070 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
19080 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
19090 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
190a0 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
190b0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
190c0 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
190d0 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
190e0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
190f0 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
19100 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
19110 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
19120 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
19130 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
19140 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
19150 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
19160 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
19170 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
19180 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
19190 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
191a0 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
191b0 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
191c0 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
191d0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
191e0 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
191f0 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
19200 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
19210 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
19220 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
19230 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
19240 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
19250 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
19260 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
19270 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
19280 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
19290 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
192a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
192b0 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
192c0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
192d0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
192e0 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
192f0 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
19300 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
19310 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
19320 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
19330 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
19340 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
19350 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
19360 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
19370 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
19380 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
19390 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
193a0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
193b0 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
193c0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
193d0 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
193e0 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
193f0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
19400 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
19410 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
19420 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
19430 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
19440 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
19450 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
19460 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
19470 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
19480 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
19490 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
194a0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
194b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
194c0 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
194d0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
194e0 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
194f0 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
19500 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
19510 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
19520 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20  pPager, 0, szJ, 
19530 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
19540 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
19550 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
19560 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
19570 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72  he "pPager->jour
19580 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
19590 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
195a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
195b0 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69  f".    ** test i
195c0 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63  s related to tic
195d0 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20  ket #2565.  See 
195e0 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69  the discussion i
195f0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
19600 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75  er_playback() fu
19610 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  nction for addit
19620 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
19630 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
19640 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20  ( nJRec==0 .    
19650 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
19660 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
19670 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
19680 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19690 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  f.    ){.      n
196a0 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a  JRec = (u32)((sz
196b0 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
196c0 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f  nalOff)/JOURNAL_
196d0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
196e0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
196f0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
19700 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26  K && ii<nJRec &&
19710 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19720 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a  Off<szJ; ii++){.
19730 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
19740 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
19750 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
19760 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
19770 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
19780 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
19790 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
197a0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
197b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
197c0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
197d0 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff>=szJ );..  
197e0 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
197f0 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
19800 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
19810 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
19820 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
19830 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
19840 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
19850 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
19860 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
19870 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
19880 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
19890 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
198a0 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
198b0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
198c0 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
198d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
198e0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
198f0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
19900 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
19910 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
19920 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  geSize);..    if
19930 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
19940 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
19950 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61  c = sqlite3WalSa
19960 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67  vepointUndo(pPag
19970 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70  er->pWal, pSavep
19980 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b  oint->aWalData);
19990 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
199a0 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
199b0 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
199c0 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
199d0 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
199e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
199f0 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70   offset==ii*(4+p
19a00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
19a10 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
19a20 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
19a30 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
19a40 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
19a50 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
19a60 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
19a70 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
19a80 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
19a90 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
19aa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19ab0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
19ac0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
19ad0 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
19ae0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
19af0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
19b00 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
19b10 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
19b20 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
19b30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
19b40 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
19b50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
19b60 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
19b70 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
19b80 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
19b90 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
19ba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
19bb0 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
19bc0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19bd0 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
19be0 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
19bf0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
19c00 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
19c10 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
19c20 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
19c30 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
19c40 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
19c50 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
19c60 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
19c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
19c80 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
19c90 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
19ca0 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
19cc0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
19cd0 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
19ce0 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
19cf0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
19d00 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
19d10 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
19d20 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
19d30 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
19d40 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
19d50 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
19d60 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
19d80 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
19d90 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
19da0 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
19db0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19dc0 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
19dd0 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
19de0 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
19df0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
19e00 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
19e10 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
19e20 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
19e30 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
19e50 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
19e60 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
19e70 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
19e80 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
19e90 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
19ea0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
19eb0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19ec0 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
19ed0 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
19ee0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
19ef0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
19f00 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
19f10 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
19f20 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
19f30 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
19f40 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
19f50 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
19f60 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
19f70 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
19f80 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
19f90 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
19fa0 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
19fb0 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
19fc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19fd0 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
19fe0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
19ff0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
1a000 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
1a010 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
1a020 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
1a030 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1a040 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
1a050 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
1a060 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
1a070 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
1a080 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
1a090 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
1a0a0 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
1a0b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
1a0c0 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
1a0d0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
1a0e0 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67  tSafetyLevel(Pag
1a0f0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1a100 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c  level, int bFull
1a110 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  Fsync){.  pPager
1a120 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76  ->noSync =  (lev
1a130 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
1a140 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
1a150 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
1a160 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20  ync = (level==3 
1a170 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
1a180 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
1a190 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1a1a0 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53   = (bFullFsync?S
1a1b0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a  QLITE_SYNC_FULL:
1a1c0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1a1d0 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  AL);.  if( pPage
1a1e0 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
1a1f0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
1a200 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1a210 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1a220 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
1a230 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
1a240 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
1a250 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
1a260 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
1a270 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
1a280 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
1a290 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
1a2a0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
1a2b0 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
1a2c0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
1a2d0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
1a2e0 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
1a2f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
1a300 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1a310 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
1a320 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1a330 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
1a340 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1a350 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
1a360 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
1a370 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
1a380 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
1a390 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
1a3a0 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
1a3b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
1a3c0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
1a3d0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
1a3e0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
1a3f0 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
1a400 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
1a410 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
1a420 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
1a430 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
1a440 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1a450 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1a460 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
1a470 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
1a480 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
1a490 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
1a4a0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
1a4b0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1a4c0 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
1a4d0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
1a4e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
1a4f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1a500 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1a510 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
1a520 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
1a530 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1a540 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
1a550 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
1a560 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
1a570 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
1a580 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
1a590 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1a5a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1a5b0 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
1a5c0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
1a5d0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
1a5e0 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
1a5f0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
1a600 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
1a610 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
1a620 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
1a630 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
1a640 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1a650 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
1a660 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1a670 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
1a680 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1a690 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
1a6a0 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
1a6b0 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
1a6c0 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
1a6d0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
1a6e0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
1a6f0 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
1a700 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a710 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
1a720 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
1a730 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
1a740 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
1a750 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
1a760 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
1a770 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
1a780 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
1a790 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
1a7a0 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
1a7b0 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
1a7c0 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
1a7d0 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
1a7e0 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
1a7f0 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
1a800 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
1a810 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
1a820 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
1a830 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
1a840 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
1a850 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
1a860 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
1a870 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
1a880 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
1a890 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
1a8a0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
1a8b0 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
1a8c0 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8e0 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
1a8f0 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
1a900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a930 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
1a940 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
1a950 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
1a960 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
1a970 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
1a980 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
1a990 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
1a9a0 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
1a9b0 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
1a9c0 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
1a9d0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
1a9e0 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
1a9f0 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
1aa00 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
1aa10 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
1aa20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
1aa30 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
1aa40 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
1aa50 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
1aa60 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
1aa70 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1aa80 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
1aa90 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
1aaa0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1aab0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
1aac0 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
1aad0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
1aae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1aaf0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1ab00 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
1ab10 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
1ab20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1ab30 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
1ab40 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
1ab50 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
1ab60 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
1ab70 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
1ab80 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
1ab90 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20  andler */.){  . 
1aba0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
1abb0 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e  ndler = xBusyHan
1abc0 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dler;.  pPager->
1abd0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
1abe0 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  = pBusyHandlerAr
1abf0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  g;.}../*.** Chan
1ac00 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
1ac10 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
1ac20 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
1ac30 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
1ac40 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
1ac50 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
1ac60 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
1ac70 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
1ac80 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
1ac90 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1aca0 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
1acb0 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
1acc0 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
1acd0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
1ace0 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
1acf0 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
1ad00 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
1ad10 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  T or SQLITE_FULL
1ad20 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
1ad30 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
1ad40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1ad50 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
1ad60 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
1ad70 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
1ad80 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
1ad90 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
1ada0 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
1adb0 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
1adc0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
1add0 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
1ade0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
1adf0 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
1ae00 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
1ae10 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
1ae20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1ae30 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
1ae40 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1ae50 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
1ae60 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
1ae70 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
1ae80 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
1ae90 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
1aea0 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
1aeb0 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
1aec0 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
1aed0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
1aee0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
1aef0 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
1af00 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1af10 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
1af20 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
1af30 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
1af40 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
1af50 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
1af60 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
1af70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
1af80 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
1af90 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
1afa0 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
1afb0 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
1afc0 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
1afd0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
1afe0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1aff0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
1b000 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
1b010 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
1b020 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
1b030 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
1b040 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
1b050 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
1b060 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
1b070 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
1b080 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
1b090 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
1b0a0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
1b0b0 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
1b0c0 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
1b0d0 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
1b0e0 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
1b0f0 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
1b100 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1b110 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
1b120 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
1b130 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1b140 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c   u16 *pPageSize,
1b150 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
1b160 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
1b170 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69  r->errCode;..  i
1b180 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b190 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65   ){.    u16 page
1b1a0 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
1b1b0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
1b1c0 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
1b1d0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
1b1e0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
1b1f0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
1b200 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67  );.    if( (pPag
1b210 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
1b220 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1b230 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  0).     && sqlit
1b240 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
1b250 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1b260 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 61  )==0 .     && pa
1b270 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
1b280 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65  ze!=pPager->page
1b290 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20  Size .    ){.   
1b2a0 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
1b2b0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
1b2c0 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
1b2d0 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
1b2e0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
1b2f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1b300 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
1b310 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
1b320 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1b330 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
1b340 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1b350 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1b360 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
1b370 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
1b380 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
1b390 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
1b3a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1b3b0 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
1b3c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1b3d0 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
1b3e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a     }.    }.    *
1b3f0 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  pPageSize = (u16
1b400 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1b410 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65  e;.    if( nRese
1b420 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65  rve<0 ) nReserve
1b430 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65   = pPager->nRese
1b440 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
1b450 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
1b460 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b  nReserve<1000 );
1b470 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
1b480 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65  serve = (i16)nRe
1b490 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72  serve;.    pager
1b4a0 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
1b4b0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
1b4c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1b4d0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1b4e0 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
1b4f0 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
1b500 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
1b510 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
1b520 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
1b530 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
1b540 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
1b550 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
1b560 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
1b570 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
1b580 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
1b590 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
1b5a0 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
1b5b0 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
1b5c0 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
1b5d0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
1b5e0 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
1b5f0 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
1b600 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
1b610 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
1b620 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
1b630 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
1b640 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
1b650 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
1b660 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1b670 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1b680 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1b690 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
1b6a0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
1b6b0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
1b6c0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
1b6d0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
1b6e0 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
1b6f0 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1b700 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
1b710 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
1b720 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
1b730 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
1b740 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1b750 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
1b760 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
1b770 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
1b780 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
1b790 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
1b7a0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
1b7b0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
1b7c0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
1b7d0 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  ge){.  int nPage
1b7e0 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  ;.  if( mxPage>0
1b7f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1b800 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
1b810 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1b820 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1b830 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 71  UNLOCK ){.    sq
1b840 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1b850 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
1b860 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge);.    assert(
1b870 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6d 78   (int)pPager->mx
1b880 50 67 6e 6f 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Pgno>=nPage );. 
1b890 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
1b8a0 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
1b8b0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1b8c0 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
1b8d0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
1b8e0 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
1b8f0 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
1b900 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
1b910 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
1b920 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
1b930 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
1b940 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
1b950 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
1b960 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
1b970 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
1b980 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
1b990 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
1b9a0 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
1b9b0 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
1b9c0 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
1b9d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1b9e0 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
1b9f0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
1ba00 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
1ba10 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
1ba20 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
1ba30 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
1ba40 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
1ba50 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
1ba60 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
1ba70 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
1ba80 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
1ba90 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
1baa0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
1bab0 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
1bac0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
1bad0 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
1bae0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
1baf0 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
1bb00 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1bb10 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
1bb20 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
1bb30 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
1bb40 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
1bb50 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
1bb60 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
1bb70 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
1bb80 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1bb90 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
1bba0 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
1bbb0 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
1bbc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
1bbd0 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
1bbe0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
1bbf0 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
1bc00 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
1bc10 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
1bc20 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
1bc30 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
1bc40 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
1bc50 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
1bc60 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
1bc70 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
1bc80 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
1bc90 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
1bca0 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
1bcb0 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
1bcc0 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
1bcd0 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
1bce0 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
1bcf0 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
1bd00 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
1bd10 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
1bd20 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
1bd30 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
1bd40 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1bd50 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
1bd60 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
1bd70 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1bd80 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
1bd90 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
1bda0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
1bdb0 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
1bdc0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
1bdd0 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
1bde0 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
1bdf0 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
1be00 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
1be10 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1be20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
1be30 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
1be40 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
1be50 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1be60 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1be70 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e );..  /* This 
1be80 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
1be90 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20  called by btree 
1bea0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
1beb0 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  r creating.  ** 
1bec0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
1bed0 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74  .  There has not
1bee0 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75   been an opportu
1bef0 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69  nity to transiti
1bf00 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d  on.  ** to WAL m
1bf10 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  ode yet..  */.  
1bf20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
1bf30 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1bf40 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
1bf50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1bf60 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
1bf70 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
1bf80 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
1bf90 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1bfa0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
1bfb0 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
1bfc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1bfd0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1bfe0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1bff0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1c000 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c010 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1c020 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1c030 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1c040 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73  atabase file ass
1c050 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68  ociated .** with
1c060 20 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c   pPager. Normall
1c070 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 63 75  y, this is calcu
1c080 6c 61 74 65 64 20 61 73 20 28 3c 64 62 20 66 69  lated as (<db fi
1c090 6c 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73  le size>/<page-s
1c0a0 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65  ize>)..** Howeve
1c0b0 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
1c0c0 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
1c0d0 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
1c0e0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
1c0f0 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
1c100 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
1c110 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
1c120 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
1c130 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
1c140 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1c150 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
1c160 65 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65  e.** error state
1c170 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1c180 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50  eturned and *pnP
1c190 61 67 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67  age left unchang
1c1a0 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68  ed. Or,.** if th
1c1b0 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61  e file system ha
1c1c0 73 20 74 6f 20 62 65 20 71 75 65 72 69 65 64 20  s to be queried 
1c1d0 66 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20  for the size of 
1c1e0 74 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20  the file and.** 
1c1f0 74 68 65 20 71 75 65 72 79 20 61 74 74 65 6d 70  the query attemp
1c200 74 20 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20  t returns an IO 
1c210 65 72 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72  error, the IO er
1c220 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1c230 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50  rned.** and *pnP
1c240 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
1c250 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  anged..**.** Oth
1c260 65 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79  erwise, if every
1c270 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
1c280 66 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ful, then SQLITE
1c290 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
1c2a0 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ** and *pnPage i
1c2b0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
1c2c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1c2d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1c2e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1c2f0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
1c300 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
1c310 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
1c320 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Page = 0;       
1c330 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
1c340 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
1c350 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 65 74 65  ge */..  /* Dete
1c360 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72  rmine the number
1c370 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1c380 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69   file. Store thi
1c390 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20  s in nPage. */. 
1c3a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1c3b0 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  izeValid ){.    
1c3c0 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  nPage = pPager->
1c3d0 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  dbSize;.  }else{
1c3e0 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c400 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62  Error returned b
1c410 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a  y OsFileSize() *
1c420 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  /.    i64 n = 0;
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c440 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79   File size in by
1c450 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  tes returned by 
1c460 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
1c470 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
1c480 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
1c490 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1c4a0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1c4b0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 44       sqlite3WalD
1c4c0 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57  bsize(pPager->pW
1c4d0 61 6c 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  al, &nPage);.   
1c4e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 50 61 67   }..    if( nPag
1c4f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  e==0 ){.      as
1c500 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1c510 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1c520 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1c530 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
1c540 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
1c550 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
1c560 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
1c570 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1c580 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 20  Pager->fd, &n)) 
1c590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
1c5a0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1c5b0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
1c5c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c5d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c5e0 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
1c5f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c600 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67   ){.        nPag
1c610 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 1;.      }el
1c620 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67  se{.        nPag
1c630 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70  e = (Pgno)(n / p
1c640 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1c650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c660 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c670 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1c680 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
1c690 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
1c6a0 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  age;.      pPage
1c6b0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
1c6c0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61  nPage;.      pPa
1c6d0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1c6e0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
1c6f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
1c700 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
1c710 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
1c720 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1c730 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69   the .  ** confi
1c740 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61  gured maximum pa
1c750 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72  ger number, incr
1c760 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64  ease the allowed
1c770 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74   limit so.  ** t
1c780 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hat the file can
1c790 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20   be read..  */. 
1c7a0 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65   if( nPage>pPage
1c7b0 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
1c7c0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
1c7d0 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20  = (Pgno)nPage;. 
1c7e0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
1c7f0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
1c800 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1c810 54 45 5f 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50 61  TE_OK */.  *pnPa
1c820 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1c830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c840 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
1c850 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
1c860 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
1c870 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1c880 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
1c890 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
1c8a0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
1c8b0 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
1c8c0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
1c8d0 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
1c8e0 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
1c8f0 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
1c900 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
1c910 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
1c920 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
1c930 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
1c940 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
1c950 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
1c960 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
1c970 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
1c980 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
1c990 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
1c9a0 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
1c9b0 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
1c9c0 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
1c9d0 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
1c9e0 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
1c9f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1ca00 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
1ca10 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
1ca20 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
1ca30 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
1ca40 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
1ca50 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
1ca60 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
1ca70 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
1ca80 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
1ca90 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1caa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1cab0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1cac0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1cad0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
1cae0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb00 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1cb10 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
1cb20 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20   OS lock values 
1cb30 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
1cb40 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f   as the Pager lo
1cb50 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61  ck values */.  a
1cb60 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41  ssert( PAGER_SHA
1cb70 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  RED==SHARED_LOCK
1cb80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
1cb90 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45  GER_RESERVED==RE
1cba0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
1cbb0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45   assert( PAGER_E
1cbc0 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53  XCLUSIVE==EXCLUS
1cbd0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
1cbe0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
1cbf0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
1cc00 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a  ked then the siz
1cc10 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77  e must be unknow
1cc20 6e 2e 20 49 74 0a 20 20 2a 2a 20 6d 75 73 74 20  n. It.  ** must 
1cc30 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f  not have been mo
1cc40 64 69 66 69 65 64 20 61 74 20 74 68 69 73 20 70  dified at this p
1cc50 6f 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  oint..  */.  ass
1cc60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1cc70 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1cc80 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
1cc90 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
1cca0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ccb0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
1ccc0 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  RED || pPager->d
1ccd0 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 29 3b 0a  bModified==0 );.
1cce0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1ccf0 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
1cd00 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
1cd10 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
1cd20 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
1cd30 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e  eady held, or on
1cd40 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73  e of the transis
1cd50 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
1cd60 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
1cd70 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
1cd80 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
1cd90 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
1cda0 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
1cdb0 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
1cdc0 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
1cdd0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
1cde0 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
1cdf0 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
1ce00 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1ce10 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63  ER_UNLOCK && loc
1ce20 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41  ktype==PAGER_SHA
1ce30 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  RED).       || (
1ce40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1ce50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 26 26  AGER_RESERVED &&
1ce60 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52   locktype==PAGER
1ce70 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b  _EXCLUSIVE).  );
1ce80 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1ce90 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  state>=locktype 
1cea0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1ceb0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1cec0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72      do {.      r
1ced0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1cee0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f  k(pPager->fd, lo
1cef0 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68  cktype);.    }wh
1cf00 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1cf10 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e  BUSY && pPager->
1cf20 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  xBusyHandler(pPa
1cf30 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
1cf40 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28  rArg) );.    if(
1cf50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cf60 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1cf70 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b  state = (u8)lock
1cf80 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
1cf90 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
1cfa0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
1cfb0 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
1cfc0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1cfd0 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
1cfe0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
1cff0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
1d000 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e  ) checks that on
1d010 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
1d020 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66  lowing is true f
1d030 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  or all dirty pag
1d040 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
1d050 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a  the page-cache:.
1d060 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70  **.**   a) The p
1d070 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  age number is le
1d080 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1d090 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
1d0a0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  the .**      cur
1d0b0 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d  rent database im
1d0c0 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f  age, in pages, O
1d0d0 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20  R.**.**   b) if 
1d0e0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1d0f0 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74   were written at
1d100 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77   this time, it w
1d110 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
1d120 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
1d130 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
1d140 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74  nt content out t
1d150 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1d160 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65  l.**      (as de
1d170 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63  termined by func
1d180 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65  tion subjRequire
1d190 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  sPage())..**.** 
1d1a0 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  If the condition
1d1b0 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69   asserted by thi
1d1c0 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20  s function were 
1d1d0 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68  not true, and th
1d1e0 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
1d1f0 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61  were to be disca
1d200 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  rded from the ca
1d210 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65  che via the page
1d220 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75  rStress().** rou
1d230 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73  tine, pagerStres
1d240 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72  s() would not wr
1d250 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
1d260 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a  page content to.
1d270 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1d280 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70  file. If a savep
1d290 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
1d2a0 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63   were rolled bac
1d2b0 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20  k after.** this 
1d2c0 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f  happened, the co
1d2d0 72 72 65 63 74 20 62 65 68 61 76 69 6f 75 72 20  rrect behaviour 
1d2e0 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74  would be to rest
1d2f0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ore the current.
1d300 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
1d310 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c  e page. However,
1d320 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74   since this cont
1d330 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ent is not prese
1d340 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  nt in either.** 
1d350 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d360 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e  e or the portion
1d370 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1d380 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a   journal and .**
1d390 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   sub-journal rol
1d3a0 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e  led back the con
1d3b0 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  tent could not b
1d3c0 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74  e restored and t
1d3d0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69  he.** database i
1d3e0 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d  mage would becom
1d3f0 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73  e corrupt. It is
1d400 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75   therefore fortu
1d410 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68  nate that .** th
1d420 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20  is circumstance 
1d430 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f  cannot arise..*/
1d440 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1d450 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69  ITE_DEBUG).stati
1d460 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
1d470 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
1d480 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  b(PgHdr *pPg){. 
1d490 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
1d4a0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
1d4b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75  );.  assert( !su
1d4c0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
1d4d0 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
1d4e0 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64  <=pPg->pPager->d
1d4f0 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69  bSize );.}.stati
1d500 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
1d510 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
1d520 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1d530 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
1d540 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
1d550 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73  er->pPCache, ass
1d560 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
1d570 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73  raintCb);.}.#els
1d580 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72  e.# define asser
1d590 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
1d5a0 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64  int(pPager).#end
1d5b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  if../*.** Trunca
1d5c0 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1d5d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1d5e0 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61  mage to nPage pa
1d5f0 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ges. This .** fu
1d600 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
1d610 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20  actually modify 
1d620 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d630 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a  e on disk. It .*
1d640 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  * just sets the 
1d650 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
1d660 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
1d670 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a  ct so that the .
1d680 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69  ** truncation wi
1d690 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20  ll be done when 
1d6a0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1d6b0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
1d6c0 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tted..*/.void sq
1d6d0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1d6e0 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70  teImage(Pager *p
1d6f0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
1d700 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
1d710 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
1d720 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
1d730 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
1d740 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
1d750 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1d760 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1d770 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
1d780 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61  ize = nPage;.  a
1d790 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d7a0 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b  straint(pPager);
1d7b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1d7c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1d7d0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
1d7e0 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
1d7f0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
1d800 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
1d810 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
1d820 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
1d830 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1d840 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
1d850 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1d860 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
1d870 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
1d880 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
1d890 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
1d8a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1d8b0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
1d8c0 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
1d8d0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
1d8e0 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
1d8f0 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
1d900 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
1d910 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
1d920 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
1d930 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
1d940 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
1d950 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
1d960 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
1d970 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
1d980 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
1d990 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
1d9a0 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
1d9b0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
1d9c0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
1d9d0 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
1d9e0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1d9f0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
1da00 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
1da10 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
1da20 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
1da30 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
1da40 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1da50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1da60 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
1da70 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
1da80 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1da90 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
1daa0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
1dab0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1dac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dad0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1dae0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1daf0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
1db00 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
1db10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1db20 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
1db30 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
1db40 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
1db50 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
1db60 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
1db70 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
1db80 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
1db90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1dba0 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
1dbb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1dbc0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
1dbd0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
1dbe0 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
1dbf0 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
1dc00 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
1dc10 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
1dc20 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
1dc30 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
1dc40 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
1dc50 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
1dc60 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
1dc70 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
1dc80 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
1dc90 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1dca0 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
1dcb0 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
1dcc0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
1dcd0 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
1dce0 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
1dcf0 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
1dd00 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
1dd10 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
1dd20 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
1dd30 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
1dd40 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
1dd50 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
1dd60 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
1dd70 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
1dd80 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
1dd90 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1dda0 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
1ddb0 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
1ddc0 70 53 70 61 63 65 3b 0a 0a 20 20 64 69 73 61 62  pSpace;..  disab
1ddd0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
1dde0 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
1ddf0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
1de00 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72  lloc();.  pPager
1de10 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
1de20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
1de30 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e  veMode = 0;.#ifn
1de40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1de50 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  WAL.  sqlite3Wal
1de60 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57  Close(pPager->pW
1de70 61 6c 2c 0a 20 20 20 20 28 70 50 61 67 65 72 2d  al,.    (pPager-
1de80 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70 50  >noSync ? 0 : pP
1de90 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1dea0 29 2c 20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ), .    pPager->
1deb0 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 0a 20  pageSize, pTmp. 
1dec0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57   );.  pPager->pW
1ded0 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  al = 0;.#endif. 
1dee0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1def0 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  ger);.  if( MEMD
1df00 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75  B ){.    pager_u
1df10 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
1df20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
1df30 65 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  et Pager.journal
1df40 48 64 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68  Hdr to -1 for th
1df50 65 20 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65  e benefit of the
1df60 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1df70 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ) .    ** call w
1df80 68 69 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65  hich may be made
1df90 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
1dfa0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
1dfb0 61 63 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20  ack(). If it.   
1dfc0 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74   ** is not -1, t
1dfd0 68 65 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64  hen the unsynced
1dfe0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f   portion of an o
1dff0 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
1e000 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70   may.    ** be p
1e010 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
1e020 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
1e030 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
1e040 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20   occurs while.  
1e050 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
1e060 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
1e070 62 61 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  base may become 
1e080 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a  corrupt..    */.
1e090 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
1e0a0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
1e0b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
1e0c0 43 6f 64 65 20 3d 20 70 61 67 65 72 53 79 6e 63  Code = pagerSync
1e0d0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
1e0e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  r);.    }.    pa
1e0f0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
1e100 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1e110 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
1e120 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1e130 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
1e140 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
1e150 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
1e160 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
1e170 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
1e180 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
1e190 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1e1a0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1e1b0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
1e1c0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
1e1d0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71  Pager->fd);.  sq
1e1e0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54  lite3PageFree(pT
1e1f0 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  mp);.  sqlite3Pc
1e200 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
1e210 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66  ->pPCache);..#if
1e220 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
1e230 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65  ODEC.  if( pPage
1e240 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
1e250 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
1e260 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
1e270 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  c);.#endif..  as
1e280 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61  sert( !pPager->a
1e290 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50  Savepoint && !pP
1e2a0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1e2b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69   );.  assert( !i
1e2c0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1e2d0 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
1e2e0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a  ager->sjfd) );..
1e2f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e300 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1e310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1e320 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
1e330 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
1e340 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
1e350 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
1e360 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67  e number for pag
1e370 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73  e pPg..*/.Pgno s
1e380 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
1e390 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50  umber(DbPage *pP
1e3a0 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
1e3b0 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
1e3c0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
1e3d0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
1e3e0 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70  count for page p
1e3f0 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Pg..*/.void sqli
1e400 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
1e410 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  ge *pPg){.  sqli
1e420 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67  te3PcacheRef(pPg
1e430 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
1e440 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e   the journal. In
1e450 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
1e460 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
1e470 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
1e480 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
1e490 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
1e4a0 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
1e4b0 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
1e4c0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   of the.** disk 
1e4d0 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f  and can be resto
1e4e0 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
1e4f0 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
1e500 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  l rollback..**.*
1e510 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
1e520 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1e530 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68  not set, then th
1e540 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1e550 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  .** no-op. Other
1e560 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e  wise, the action
1e570 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e  s required depen
1e580 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1e590 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65  -mode.** and the
1e5a0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1e5b0 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 74  ristics of the t
1e5c0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
1e5d0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1e5e0 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
1e5f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
1e600 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
1e610 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
1e620 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
1e630 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
1e640 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1e650 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
1e660 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
1e670 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
1e680 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
1e690 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
1e6a0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
1e6b0 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
1e6c0 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
1e6d0 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
1e6e0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
1e6f0 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
1e700 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
1e710 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
1e720 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
1e730 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
1e740 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
1e750 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
1e760 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
1e770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1e780 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
1e790 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
1e7a0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
1e7b0 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
1e7c0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
1e7d0 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
1e7e0 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
1e7f0 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
1e800 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
1e810 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
1e820 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
1e830 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
1e840 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
1e850 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
1e860 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
1e870 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
1e880 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
1e890 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
1e8a0 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
1e8b0 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
1e8c0 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
1e8d0 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
1e8e0 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
1e8f0 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
1e900 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61    }.**.** The Pa
1e910 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
1e920 67 20 69 73 20 6e 65 76 65 72 20 62 65 20 73 65  g is never be se
1e930 74 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  t for temporary 
1e940 66 69 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a  files, or any.**
1e950 20 66 69 6c 65 20 6f 70 65 72 61 74 69 6e 67 20   file operating 
1e960 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  in no-sync mode 
1e970 28 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65  (Pager.noSync se
1e980 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a  t to non-zero)..
1e990 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1e9a0 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ful, this routin
1e9b0 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48  e clears the PGH
1e9c0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
1e9d0 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70  g of every .** p
1e9e0 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65  age currently he
1e9f0 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66  ld in memory bef
1ea00 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
1ea10 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
1ea20 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e  O.** error is en
1ea30 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
1ea40 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
1ea50 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
1ea60 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
1ea70 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
1ea80 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1ea90 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
1eaa0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  ger->needSync ){
1eab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
1eac0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1ead0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1eae0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
1eaf0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1eb00 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
1eb10 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1eb40 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  code */.      co
1eb50 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71  nst int iDc = sq
1eb60 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1eb70 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1eb80 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
1eb90 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1eba0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
1ebb0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
1ebc0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1ebd0 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
1ebe0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
1ebf0 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
1ec00 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c  an obscure probl
1ec10 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20  em. If the last 
1ec20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
1ec30 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
1ec40 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
1ec50 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20  e was operating 
1ec60 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f  in persistent-jo
1ec70 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
1ec80 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
1ec90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
1eca0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61   at this point a
1ecb0 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65  ctually be large
1ecc0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  r.        ** tha
1ecd0 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  n Pager.journalO
1ece0 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65  ff bytes. If the
1ecf0 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74   next thing in t
1ed00 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1ed10 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65     ** file happe
1ed20 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  ns to be a journ
1ed30 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74  al-header (writt
1ed40 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
1ed50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
1ed60 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  vious connection
1ed70 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  's transaction),
1ed80 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20   and a crash or 
1ed90 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20  power-failure . 
1eda0 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73         ** occurs
1edb0 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75   after nRec is u
1edc0 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  pdated but befor
1edd0 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
1ede0 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20  n writes .      
1edf0 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c    ** anything el
1ee00 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  se to the journa
1ee10 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69  l file (or commi
1ee20 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74  ts/rolls back it
1ee30 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  s .        ** tr
1ee40 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e  ansaction), then
1ee50 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f   SQLite may beco
1ee60 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e  me confused when
1ee70 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20   doing the .    
1ee80 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
1ee90 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  al rollback foll
1eea0 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20  owing recovery. 
1eeb0 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b  It may roll back
1eec0 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
1eed0 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
1eee0 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70  ons data, then p
1eef0 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e  roceed to rollin
1ef00 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a  g back the old,.
1ef10 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f          ** out-o
1ef20 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74  f-date data that
1ef30 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74   follows it. Dat
1ef40 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1ef50 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
1ef60 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20       ** To work 
1ef70 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
1ef80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ef90 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20   does appear to 
1efa0 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20  contain.        
1efb0 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65  ** a valid heade
1efc0 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65  r following Page
1efd0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68  r.journalOff, th
1efe0 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a  en write a 0x00.
1eff0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20          ** byte 
1f000 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1f010 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  it to prevent it
1f020 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f   from being reco
1f030 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20  gnized..        
1f040 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61  **.        ** Va
1f050 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f  riable iNextHdrO
1f060 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20  ffset is set to 
1f070 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68  the offset at wh
1f080 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20  ich this.       
1f090 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20   ** problematic 
1f0a0 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75  header will occu
1f0b0 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  r, if it exists.
1f0c0 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20   aMagic is used 
1f0d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61  .        ** as a
1f0e0 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
1f0f0 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65  r to inspect the
1f100 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66   first couple of
1f110 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20   bytes of.      
1f120 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69    ** the potenti
1f130 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  al journal heade
1f140 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
1f150 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48        i64 iNextH
1f160 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  drOffset;.      
1f170 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a    u8 aMagic[8];.
1f180 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64          u8 zHead
1f190 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
1f1a0 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20  alMagic)+4];..  
1f1b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65        memcpy(zHe
1f1c0 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
1f1d0 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
1f1e0 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
1f1f0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26       put32bits(&
1f200 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
1f210 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
1f220 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
1f230 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
1f240 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
1f250 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
1f260 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1f270 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1f280 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
1f290 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
1f2a0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
1f2b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f2c0 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
1f2d0 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
1f2e0 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
1f2f0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1f300 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
1f310 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
1f320 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1f330 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
1f340 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
1f350 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
1f360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1f370 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f380 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
1f390 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1f3a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1f3b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1f3c0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
1f3d0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
1f3e0 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
1f3f0 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
1f400 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
1f410 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
1f420 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
1f430 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
1f440 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
1f450 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
1f460 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
1f470 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
1f480 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
1f490 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
1f4a0 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
1f4b0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
1f4c0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
1f4d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
1f4e0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1f4f0 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
1f500 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
1f510 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
1f520 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
1f530 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
1f540 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
1f550 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1f560 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
1f570 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
1f580 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
1f590 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
1f5a0 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
1f5b0 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
1f5c0 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
1f5d0 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
1f5e0 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
1f5f0 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
1f600 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
1f610 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
1f620 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1f630 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
1f640 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
1f650 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1f660 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1f670 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1f680 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1f690 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1f6a0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1f6b0 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1f6c0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
1f6d0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
1f6e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f6f0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
1f700 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1f710 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
1f720 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f730 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1f740 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f750 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
1f760 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
1f770 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
1f780 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
1f790 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f7a0 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
1f7b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
1f7c0 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
1f7d0 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
1f7e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20  er->journalHdr. 
1f7f0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1f800 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f810 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1f820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f830 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1f840 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1f850 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
1f860 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
1f870 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
1f880 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1f890 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
1f8a0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
1f8b0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
1f8c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f8d0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1f8e0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
1f8f0 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20  nc_flags| .     
1f900 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
1f910 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  nc_flags==SQLITE
1f920 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
1f930 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
1f940 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
1f950 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f960 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1f970 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1f980 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a   }..    /* The j
1f990 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
1f9a0 6a 75 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c  just successfull
1f9b0 79 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61  y synced. Set Pa
1f9c0 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20  ger.needSync .  
1f9d0 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64    ** to zero and
1f9e0 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
1f9f0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
1fa00 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20  on all pagess.. 
1fa10 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
1fa20 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1fa30 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1fa40 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
1fa50 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1fa60 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
1fa70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
1fa80 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
1fa90 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
1faa0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1fab0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1fac0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1fad0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
1fae0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
1faf0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64  linked list of d
1fb00 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65  irty pages conne
1fb10 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50  cted.** by the P
1fb20 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
1fb30 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
1fb40 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f  on writes each o
1fb50 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d  ne of the.** in-
1fb60 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20  memory pages in 
1fb70 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20  the list to the 
1fb80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1fb90 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a  he argument may.
1fba0 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72  ** be NULL, repr
1fbb0 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74  esenting an empt
1fbc0 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20  y list. In this 
1fbd0 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  case this functi
1fbe0 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  on is.** a no-op
1fbf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
1fc00 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c  r must hold at l
1fc10 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
1fc20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66  lock when this f
1fc30 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
1fc40 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69  lled. Before wri
1fc50 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f  ting anything to
1fc60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fc70 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a  le, this lock.**
1fc80 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20   is upgraded to 
1fc90 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1fca0 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63  k. If the lock c
1fcb0 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
1fcc0 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d,.** SQLITE_BUS
1fcd0 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  Y is returned an
1fce0 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69  d no data is wri
1fcf0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
1fd00 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
1fd10 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
1fd20 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61  s a temp-file pa
1fd30 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75  ger and the actu
1fd40 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  al file-system f
1fd50 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65  ile.** is not ye
1fd60 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72  t open, it is cr
1fd70 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  eated and opened
1fd80 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
1fd90 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
1fda0 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  out..**.** Once 
1fdb0 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
1fdc0 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20  n upgraded and, 
1fdd0 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68  if necessary, th
1fde0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a  e file opened,.*
1fdf0 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20  * the pages are 
1fe00 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
1fe10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fe20 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20   in list order. 
1fe30 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67  Writing.** a pag
1fe40 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  e is skipped if 
1fe50 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20  it meets either 
1fe60 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1fe70 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a   criteria:.**.**
1fe80 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75     * The page nu
1fe90 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
1fea0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
1feb0 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65  e, or.**   * The
1fec0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
1fed0 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  E flag is set on
1fee0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
1fef0 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20   If writing out 
1ff00 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68  a page causes th
1ff10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ff20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64  to grow, Pager.d
1ff30 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20  bFileSize.** is 
1ff40 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e  updated accordin
1ff50 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69  gly. If page 1 i
1ff60 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74  s written out, t
1ff70 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61  hen the value ca
1ff80 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72  ched.** in Pager
1ff90 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
1ffa0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63   updated to matc
1ffb0 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  h the new value 
1ffc0 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65  stored in.** the
1ffd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1ffe0 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
1fff0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
20000 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
20010 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
20020 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
20030 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
20040 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
20050 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58  d. Or, if the EX
20060 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e  CLUSIVE lock can
20070 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e  not.** be obtain
20080 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ed, SQLITE_BUSY 
20090 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
200a0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
200b0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
200c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
200d0 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
200e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20100 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
20110 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20  ode */..  /* At 
20120 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
20130 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
20140 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
20150 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
20160 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
20170 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
20180 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
20190 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
201a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
201b0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
201c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
201d0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
201e0 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
201f0 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
20200 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
20210 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
20220 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
20230 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
20240 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
20250 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
20260 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
20270 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
20280 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
20290 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
202a0 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
202b0 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
202c0 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
202d0 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
202e0 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
202f0 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
20300 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
20310 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
20320 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
20330 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
20340 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
20350 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
20360 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
20370 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
20380 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
20390 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
203a0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
203b0 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
203c0 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
203d0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
203e0 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
203f0 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
20400 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
20410 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
20420 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
20430 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
20440 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
20450 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
20460 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
20470 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
20480 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
20490 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
204a0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
204b0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
204c0 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
204d0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
204e0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
204f0 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  LOCK);..  /* If 
20500 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
20510 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
20520 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
20530 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
20540 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
20550 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
20560 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
20570 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
20580 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
20590 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
205a0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
205b0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
205c0 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
205d0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
205e0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
205f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
20600 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
20610 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
20620 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
20630 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
20640 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
20650 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
20660 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66   /* Before the f
20670 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65  irst write, give
20680 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20   the VFS a hint 
20690 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  of what the fina
206a0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65  l.  ** file size
206b0 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20   will be..  */. 
206c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
206d0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
206e0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
206f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20700 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 64  _OK && pPager->d
20710 62 53 69 7a 65 3e 28 70 50 61 67 65 72 2d 3e 64  bSize>(pPager->d
20720 62 4f 72 69 67 53 69 7a 65 2b 31 29 20 29 7b 0a  bOrigSize+1) ){.
20730 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
20740 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65  4 szFile = pPage
20750 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73  r->pageSize * (s
20760 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61  qlite3_int64)pPa
20770 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
20780 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
20790 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
207a0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
207b0 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c  IZE_HINT, &szFil
207c0 65 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  e);.  }..  while
207d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
207e0 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
207f0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
20800 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
20810 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
20820 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
20830 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
20840 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
20850 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
20860 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
20870 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
20880 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
20890 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
208a0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
208b0 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
208c0 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
208d0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
208e0 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
208f0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
20900 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
20910 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
20920 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
20930 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
20940 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
20950 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
20960 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
20970 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
20980 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
20990 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
209a0 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
209b0 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
209c0 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
209d0 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
209e0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
209f0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
20a00 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20a10 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
20a20 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
20a30 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20a60 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
20a70 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 2f 2a  */    ..      /*
20a80 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
20a90 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
20aa0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
20ab0 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
20ac0 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
20ad0 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b  E_NOMEM, pData);
20ae0 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
20af0 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
20b00 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
20b10 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
20b20 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
20b30 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
20b40 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
20b50 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
20b60 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
20b70 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
20b80 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
20b90 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
20ba0 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
20bb0 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
20bc0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
20bd0 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
20be0 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
20bf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20c00 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
20c10 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
20c20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
20c30 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
20c40 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
20c50 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
20c60 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
20c70 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
20c80 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
20c90 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
20ca0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
20cb0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
20cc0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
20cd0 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
20ce0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  }..      /* Upda
20cf0 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
20d00 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
20d10 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
20d20 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
20d30 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
20d40 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
20d50 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
20d60 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
20d70 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
20d80 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
20d90 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
20da0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
20db0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
20dc0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
20dd0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
20de0 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
20df0 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
20e00 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
20e10 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
20e20 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
20e30 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
20e40 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41  count);.      PA
20e50 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
20e60 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65  >nWrite);.    }e
20e70 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
20e80 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
20e90 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
20ea0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
20eb0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69  pgno));.    }.#i
20ec0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
20ed0 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73  K_PAGES.    pLis
20ee0 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  t->pageHash = pa
20ef0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
20f00 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  st);.#endif.    
20f10 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
20f20 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65  Dirty;.  }..  re
20f30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20f40 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  * Ensure that th
20f50 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
20f60 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69  le is open. If i
20f70 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
20f80 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n, this .** func
20f90 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
20fa0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
20fb0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
20fc0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
20fd0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
20fe0 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  n. An .** SQLITE
20ff0 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
21000 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
21010 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73  d if a call to s
21020 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a  qlite3OsOpen() .
21030 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  ** fails..*/.sta
21040 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
21050 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
21060 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
21070 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
21080 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
21090 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
210a0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
210b0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
210c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
210d0 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62  Y || pPager->sub
210e0 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
210f0 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
21100 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
21110 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  >sjfd);.    }els
21120 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
21130 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
21140 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  er, pPager->sjfd
21150 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
21160 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  BJOURNAL);.    }
21170 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
21190 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
211a0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
211b0 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
211c0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
211d0 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
211e0 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
211f0 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
21200 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
21210 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
21220 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
21230 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
21240 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
21250 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
21260 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
21270 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
21280 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
21290 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
212a0 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
212b0 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
212c0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
212d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
212e0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
212f0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
21300 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
21310 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
21320 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
21330 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
21340 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
21350 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
21360 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
21370 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
21380 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
21390 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
213a0 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
213b0 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
213c0 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
213d0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
213e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
213f0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
21400 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
21410 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
21420 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
21430 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20  LMODE_OFF ){..  
21440 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75    /* Open the su
21450 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  b-journal, if it
21460 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
21470 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a   been opened */.
21480 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
21490 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
214a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
214b0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
214c0 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  ) || pagerUseWal
214d0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
214e0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
214f0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20  Pager->sjfd) || 
21500 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d  pPager->nSubRec=
21510 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
21520 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
21530 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20  ager) .         
21540 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  || pageInJournal
21550 28 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20  (pPg) .         
21560 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
21570 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
21580 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
21590 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
215a0 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
215b0 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
215c0 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
215d0 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
215e0 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
215f0 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
21600 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
21610 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
21620 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
21630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21640 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
21650 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
21660 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
21670 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  = pPager->nSubRe
21680 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
21690 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68  eSize);.      ch
216a0 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20  ar *pData2;.  . 
216b0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
216c0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
216d0 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
216e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
216f0 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47  ata2);.      PAG
21700 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
21710 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
21720 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
21730 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
21740 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
21750 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
21760 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c  r->sjfd, offset,
21770 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
21780 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
217a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
217b0 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ite(pPager->sjfd
217c0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
217d0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
217e0 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+4);.      }. 
217f0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
21800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21810 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
21820 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
21830 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
21840 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
21850 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
21860 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
21870 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
21880 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21890 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
218a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
218b0 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
218c0 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20  yer when it has 
218d0 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20  reached some.** 
218e0 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69  soft memory limi
218f0 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
21900 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
21910 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62  er to a Pager ob
21920 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73  ject.** (cast as
21930 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70   a void*). The p
21940 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27  ager is always '
21950 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20  purgeable' (not 
21960 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
21970 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73  database). The s
21980 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
21990 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
219a0 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20   a page that is 
219b0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69  .** currently di
219c0 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f  rty but has no o
219d0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
219e0 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a  ences. The page.
219f0 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  ** is always ass
21a00 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
21a10 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
21a20 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
21a30 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  t .** argument..
21a40 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
21a50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
21a60 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c  s to make pPg cl
21a70 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69  ean by writing i
21a80 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  ts contents.** o
21a90 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
21aa0 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73  se file, if poss
21ab0 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69  ible. This may i
21ac0 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74  nvolve syncing t
21ad0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
21ae0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  le. .**.** If su
21af0 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65  ccessful, sqlite
21b00 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
21b10 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
21b20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  the page and.** 
21b30 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
21b40 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
21b50 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
21b60 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74  trying to make t
21b70 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e  he.** page clean
21b80 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
21b90 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
21ba0 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e   If the page can
21bb0 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63  not be.** made c
21bc0 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74  lean for some ot
21bd0 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20  her reason, but 
21be0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
21bf0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a   then SQLITE_OK.
21c00 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  ** is returned b
21c10 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  y sqlite3PcacheM
21c20 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f  akeClean() is no
21c30 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  t called..*/.sta
21c40 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
21c50 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
21c60 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
21c70 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
21c80 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
21c90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
21ca0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
21cb0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
21cc0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
21cd0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
21ce0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f   );..  /* The do
21cf0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61  NotSyncSpill fla
21d00 67 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  g is set during 
21d10 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67  times when doing
21d20 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20   a sync of.  ** 
21d30 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64  journal (and add
21d40 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72  ing a new header
21d50 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  ) is not allowed
21d60 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20  .  This occurs. 
21d70 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73   ** during calls
21d80 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
21d90 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72  Write() while tr
21da0 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  ying to journal 
21db0 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61  multiple.  ** pa
21dc0 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ges belonging to
21dd0 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
21de0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
21df0 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20  doNotSpill flag 
21e00 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
21e10 68 65 20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61  he spilling rega
21e20 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
21e30 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20  r.  ** or not a 
21e40 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
21e50 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20 64  .  This is set d
21e60 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
21e70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c  ..  **.  ** Spil
21e80 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 69 6e 68  ling is also inh
21e90 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
21ea0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 20  n error state.. 
21eb0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
21ec0 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
21ed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
21ee0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
21ef0 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72 6e 20  tSpill ) return 
21f00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
21f10 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
21f20 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50 67 2d  ncSpill && (pPg-
21f30 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
21f40 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a  EED_SYNC)!=0 ){.
21f50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21f60 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67  E_OK;.  }..  pPg
21f70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
21f80 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
21f90 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
21fa0 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65  * Write a single
21fb0 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20   frame for this 
21fc0 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e  page to the log.
21fd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
21fe0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
21ff0 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d  ) ){ .      rc =
22000 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
22010 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20  pPg); .    }.   
22020 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22030 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
22040 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
22050 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20  pPager, pPg, 0, 
22060 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
22070 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
22080 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
22090 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
220a0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
220b0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
220c0 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
220d0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
220e0 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20  r->noSync );.   
220f0 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
22100 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
22110 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22120 45 5f 4f 4b 20 26 26 20 0a 20 20 20 20 20 20 20  E_OK && .       
22130 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   !(pPager->journ
22140 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
22150 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
22160 29 20 26 26 0a 20 20 20 20 20 20 20 20 21 28 73  ) &&.        !(s
22170 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
22180 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
22190 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
221a0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
221b0 4e 44 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ND).      ){.   
221c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
221d0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
221e0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
221f0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
22200 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
22210 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
22220 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20   number of this 
22230 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74  page is larger t
22240 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
22250 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  size of.    ** t
22260 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
22270 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74  e, it may need t
22280 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  o be written to 
22290 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
222a0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
222b0 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
222c0 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f   to pager_write_
222d0 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77  pagelist() below
222e0 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a   will not.    **
222f0 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20   actually write 
22300 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
22310 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
22320 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e     **.    ** Con
22330 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
22340 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
22350 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20  events:.    **. 
22360 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20     **   BEGIN;. 
22370 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e     **     <journ
22380 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  al page X>.    *
22390 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61  *     <modify pa
223a0 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
223b0 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20   SAVEPOINT sp;. 
223c0 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72     **       <shr
223d0 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ink database fil
223e0 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20  e to Y pages>.  
223f0 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
22400 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
22410 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41     **     ROLLBA
22420 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a  CK TO sp;.    **
22430 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29  .    ** If (X>Y)
22440 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65  , then when page
22450 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65  rStress is calle
22460 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f  d page X will no
22470 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20  t be written.   
22480 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64   ** out to the d
22490 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75  atabase file, bu
224a0 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  t will be droppe
224b0 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
224c0 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66  . Then,.    ** f
224d0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f  ollowing the "RO
224e0 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74  LLBACK TO sp" st
224f0 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67  atement, reading
22500 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61   page X will rea
22510 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72  d.    ** data fr
22520 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
22530 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  file. This will 
22540 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70  be the copy of p
22550 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20  age X as it.    
22560 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  ** was when the 
22570 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
22580 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77  ted, not as it w
22590 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49  as when "SAVEPOI
225a0 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61  NT sp".    ** wa
225b0 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  s executed..    
225c0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
225d0 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69  lution is to wri
225e0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  te the current d
225f0 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69  ata for page X i
22600 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
22610 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
22620 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e   now (if it is n
22630 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65  ot already there
22640 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ), so that it wi
22650 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73  ll.    ** be res
22660 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72  tored to its cur
22670 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20  rent value when 
22680 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
22690 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20   sp" is .    ** 
226a0 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f  executed..    */
226b0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a  .    if( NEVER(.
226c0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
226d0 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67  TE_OK && pPg->pg
226e0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
226f0 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65  e && subjRequire
22700 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29  sPage(pPg).    )
22710 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
22720 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
22730 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  g);.    }.  .   
22740 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
22750 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
22760 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
22770 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
22780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
227a0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
227b0 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c  pagelist(pPager,
227c0 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   pPg);.    }.  }
227d0 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
227e0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
227f0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
22800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
22810 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
22820 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
22830 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
22840 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
22850 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
22860 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
22870 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
22880 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
22890 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   rc);.}.../*.** 
228a0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
228b0 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
228c0 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
228d0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
228e0 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
228f0 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
22900 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
22910 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
22920 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
22930 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
22940 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
22950 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
22960 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
22970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
22980 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
22990 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
229a0 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
229b0 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
229c0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
229d0 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
229e0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
229f0 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
22a00 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
22a10 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
22a20 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
22a30 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
22a40 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
22a50 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
22a60 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
22a70 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
22a80 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
22a90 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
22aa0 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
22ab0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
22ac0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
22ad0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
22ae0 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
22af0 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
22b00 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
22b10 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
22b20 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
22b30 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
22b40 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
22b50 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
22b60 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
22b70 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
22b80 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
22b90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
22ba0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
22bb0 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
22bc0 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
22bd0 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
22be0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
22bf0 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
22c00 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
22c10 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
22c20 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
22c30 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
22c40 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  d PAGER_NO_READL
22c50 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  OCK flags..**.**
22c60 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
22c70 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
22c80 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
22c90 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
22ca0 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
22cb0 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
22cc0 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
22cd0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
22ce0 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
22cf0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
22d00 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
22d10 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
22d20 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
22d30 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
22d40 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
22d50 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
22d60 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
22d70 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
22d80 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
22d90 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
22da0 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
22db0 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
22dc0 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
22dd0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
22de0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
22df0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
22e00 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
22e10 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
22e20 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
22e30 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
22e40 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
22e50 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
22e60 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22e70 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
22e80 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
22e90 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
22ea0 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
22eb0 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
22ec0 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
22ed0 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
22ee0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
22ef0 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
22f00 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
22f10 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
22f20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22f30 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
22f40 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
22f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
22f60 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
22f70 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
22f80 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
22f90 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
22fa0 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
22fb0 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
22fc0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
22fd0 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
22fe0 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
22ff0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
23000 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
23010 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
23020 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f  init)(DbPage*) /
23030 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65  * Function to re
23040 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73  initialize pages
23050 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
23060 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
23070 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
23080 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
23090 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
230a0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
230b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
230c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
230d0 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
230e0 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
230f0 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
23100 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
23110 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
23120 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
23130 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
23140 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
23150 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
23160 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
23170 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
23180 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
23190 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
231a0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
231b0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
231c0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
231d0 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
231e0 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
231f0 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
23200 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
23210 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
23220 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
23230 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
23240 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23250 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
23260 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
23270 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
23280 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
23290 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
232a0 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
232b0 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  rnal */.  int no
232c0 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
232d0 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
232e0 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54  DLOCK)!=0;  /* T
232f0 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64  rue to omit read
23300 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  -lock */.  int p
23310 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
23320 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
23330 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
23340 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
23350 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20  PCache */.  u16 
23360 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
23370 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
23380 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
23390 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
233a0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
233b0 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
233c0 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
233d0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
233e0 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
233f0 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
23400 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
23410 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
23420 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69  ub-journal). Thi
23430 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61  s.  ** is the ma
23440 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
23450 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ired for an in-m
23460 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
23470 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20  le handle .  ** 
23480 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f  and a regular jo
23490 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
234a0 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22  e. Note that a "
234b0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d  regular journal-
234c0 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79  handle".  ** may
234d0 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61   be a wrapper ca
234e0 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67  pable of caching
234f0 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69   the first porti
23500 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
23510 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d  l.  ** file in m
23520 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65  emory to impleme
23530 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  nt the atomic-wr
23540 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
23550 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72   (see .  ** sour
23560 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e  ce file journal.
23570 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  c)..  */.  if( s
23580 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
23590 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
235a0 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
235b0 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
235c0 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
235d0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
235e0 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c  ze(pVfs));.  }el
235f0 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
23600 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
23610 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  (sqlite3MemJourn
23620 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a  alSize());.  }..
23630 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
23640 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
23650 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
23660 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
23670 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
23680 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
23690 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
236a0 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
236b0 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
236c0 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
236d0 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
236e0 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
236f0 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
23700 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
23710 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
23720 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
23730 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
23740 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
23750 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
23760 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
23770 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
23780 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
23790 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
237a0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
237b0 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
237c0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
237d0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
237e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
237f0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
23800 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
23810 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  DB.    if( strcm
23820 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65  p(zFilename,":me
23830 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  mory:")==0 ){.  
23840 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
23850 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
23860 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ] = 0;.    }else
23870 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
23880 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
23890 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
238a0 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
238b0 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
238c0 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
238d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
238e0 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
238f0 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
23900 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
23910 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  hname);.    }.. 
23920 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
23930 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
23940 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
23950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23960 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
23970 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
23980 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
23990 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
239a0 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
239b0 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
239c0 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
239d0 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
239e0 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
239f0 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
23a00 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
23a10 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
23a20 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
23a30 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
23a40 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
23a50 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
23a60 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
23a70 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
23a80 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
23a90 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
23aa0 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
23ab0 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
23ac0 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
23ad0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
23ae0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
23af0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
23b00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23b10 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23b20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
23b30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23b40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
23b50 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
23b60 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
23b70 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a  ture, PCache obj
23b80 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68  ect, the.  ** th
23b90 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ree file descrip
23ba0 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61  tors, the databa
23bb0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  se file name and
23bc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
23bd0 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68  ** file name. Th
23be0 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f  e layout in memo
23bf0 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  ry is as follows
23c00 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
23c10 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20  Pager object    
23c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c30 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62  (sizeof(Pager) b
23c40 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50  ytes).  **     P
23c50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20  Cache object    
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
23c70 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
23c80 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e() bytes).  ** 
23c90 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
23ca0 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
23cb0 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46      (pVfs->szOsF
23cc0 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ile bytes).  ** 
23cd0 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20      Sub-journal 
23ce0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
23cf0 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
23d00 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
23d10 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61       Main journa
23d20 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
23d30 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
23d40 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
23d50 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
23d60 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
23d70 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
23d80 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  +1 bytes).  **  
23d90 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
23da0 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
23db0 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b     (nPathname+8+
23dc0 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20  1 bytes).  */.  
23dd0 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c  pPtr = (u8 *)sql
23de0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
23df0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
23e00 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20  f(*pPager)) +   
23e10 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
23e20 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55  cture */.    ROU
23e30 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20  ND8(pcacheSize) 
23e40 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  +           /* P
23e50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Cache object */.
23e60 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d      ROUND8(pVfs-
23e70 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20  >szOsFile) +    
23e80 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
23e90 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f  b file */.    jo
23ea0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20  urnalFileSize * 
23eb0 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2 +          /* 
23ec0 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20  The two journal 
23ed0 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50  files */ .    nP
23ee0 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20  athname + 1 +   
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23f00 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20  zFilename */.   
23f10 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b   nPathname + 8 +
23f20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
23f30 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  /* zJournal */.#
23f40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23f50 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61  IT_WAL.    + nPa
23f60 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 31 20 20  thname + 4 + 1  
23f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
23f80 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  Wal */.#endif.  
23f90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
23fa0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
23fb0 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  T(SQLITE_INT_TO_
23fc0 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  PTR(journalFileS
23fd0 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21  ize)) );.  if( !
23fe0 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pPtr ){.    sqli
23ff0 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
24000 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
24010 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
24020 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20  }.  pPager =    
24030 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72            (Pager
24040 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67  *)(pPtr);.  pPag
24050 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20  er->pPCache =   
24060 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20   (PCache*)(pPtr 
24070 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
24080 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70  (*pPager)));.  p
24090 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73  Pager->fd =   (s
240a0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
240b0 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61  tr += ROUND8(pca
240c0 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61  cheSize));.  pPa
240d0 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c  ger->sjfd = (sql
240e0 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
240f0 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d   += ROUND8(pVfs-
24100 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70  >szOsFile));.  p
24110 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73  Pager->jfd =  (s
24120 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
24130 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
24140 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  eSize);.  pPager
24150 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20  ->zFilename =   
24160 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
24170 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
24180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
24190 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
241a0 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  T(pPager->jfd) )
241b0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
241c0 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e  the Pager.zFilen
241d0 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ame and Pager.zJ
241e0 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20  ournal buffers, 
241f0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
24200 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
24210 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  ){.    pPager->z
24220 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
24230 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
24240 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20  hname + 1);.    
24250 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
24260 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Filename, zPathn
24270 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
24280 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
24290 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50  er->zJournal, zP
242a0 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
242b0 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
242c0 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
242d0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
242e0 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20  journal", 8);.  
242f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46    if( pPager->zF
24300 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b  ilename[0]==0 ){
24310 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
24320 4a 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a  Journal[0] = 0;.
24330 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
24340 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
24350 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50    else{.      pP
24360 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50  ager->zWal = &pP
24370 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
24380 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20  Pathname+8+1];. 
24390 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67       memcpy(pPag
243a0 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e  er->zWal, zPathn
243b0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
243c0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
243d0 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
243e0 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 22 2c 20  hname], "-wal", 
243f0 34 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  4);.    }.#endif
24400 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24410 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
24420 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  }.  pPager->pVfs
24430 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65   = pVfs;.  pPage
24440 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
24450 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70  sFlags;..  /* Op
24460 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
24470 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  e..  */.  if( zF
24480 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
24490 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44  name[0] && !memD
244a0 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75  b ){.    int fou
244b0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
244c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
244d0 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
244e0 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  by xOpen() */.  
244f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
24500 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
24510 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
24520 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61  ager->fd, vfsFla
24530 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20  gs, &fout);.    
24540 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
24550 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
24560 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20  DONLY);..    /* 
24570 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
24580 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
24590 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ned for read/wri
245a0 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a  te access,.    *
245b0 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75  * choose a defau
245c0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  lt page size in 
245d0 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20  case we have to 
245e0 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a  create the.    *
245f0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
24600 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   The default pag
24610 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61  e size is the ma
24620 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a  ximum of:.    **
24630 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c  .    **    + SQL
24640 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
24650 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20  _SIZE,.    **   
24660 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74   + The value ret
24670 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
24680 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
24690 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c     **    + The l
246a0 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65  argest page size
246b0 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69   that can be wri
246c0 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tten atomically.
246d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
246e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
246f0 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20   !readOnly ){.  
24700 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a      setSectorSiz
24710 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
24720 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44   assert(SQLITE_D
24730 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
24740 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
24750 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
24760 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67  .      if( szPag
24770 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65  eDflt<pPager->se
24780 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20  ctorSize ){.    
24790 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
247a0 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54  sectorSize>SQLIT
247b0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
247c0 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
247d0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
247e0 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  = SQLITE_MAX_DEF
247f0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
24800 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24810 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
24820 66 6c 74 20 3d 20 28 75 31 36 29 70 50 61 67 65  flt = (u16)pPage
24830 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
24840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24850 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
24860 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
24870 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  TE.      {.     
24880 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
24890 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
248a0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
248b0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
248c0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
248d0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
248e0 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
248f0 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20  (512>>8));.     
24900 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
24910 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
24920 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
24930 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
24940 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
24950 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33  _PAGE_SIZE<=6553
24960 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  6);.        for(
24970 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69  ii=szPageDflt; i
24980 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
24990 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
249a0 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
249b0 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51       if( iDc&(SQ
249c0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
249d0 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20  C|(ii>>8)) ){.  
249e0 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
249f0 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20  Dflt = ii;.     
24a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
24a10 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
24a20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
24a30 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
24a40 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
24a50 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
24a60 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
24a70 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
24a80 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
24a90 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
24aa0 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
24ab0 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
24ac0 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
24ad0 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
24ae0 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
24af0 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  rite()..    **. 
24b00 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
24b10 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f  h is also run fo
24b20 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
24b30 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d  atabase. An in-m
24b40 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74  emory.    ** dat
24b50 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d  abase is the sam
24b60 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e as a temp-file
24b70 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77   that is never w
24b80 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20  ritten out to.  
24b90 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73    ** disk and us
24ba0 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  es an in-memory 
24bb0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
24bc0 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65  ..    */ .    te
24bd0 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
24be0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
24bf0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
24c00 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
24c10 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
24c20 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
24c30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
24c40 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
24c50 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
24c60 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
24c70 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
24c80 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
24c90 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
24ca0 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
24cb0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
24cc0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
24cd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24ce0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24cf0 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
24d00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24d10 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
24d20 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
24d30 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
24d40 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
24d50 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
24d60 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
24d70 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  rred in either o
24d80 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
24d90 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20  ve, free the .  
24da0 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  ** Pager structu
24db0 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
24dc0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
24dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24de0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
24df0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
24e00 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
24e10 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
24e20 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
24e30 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
24e40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24e50 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
24e60 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
24e70 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ject. */.  asser
24e80 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29  t( nExtra<1000 )
24e90 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55  ;.  nExtra = ROU
24ea0 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73  ND8(nExtra);.  s
24eb0 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
24ec0 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
24ed0 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
24f00 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
24f10 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
24f20 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45  PCache);..  PAGE
24f30 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  RTRACE(("OPEN %d
24f40 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
24f50 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
24f60 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
24f70 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ame));.  IOTRACE
24f80 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
24f90 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
24fa0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20  ->zFilename)).. 
24fb0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
24fc0 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75  nal = (u8)useJou
24fd0 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
24fe0 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f  noReadlock = (no
24ff0 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64  Readlock && read
25000 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a  Only) ?1:0;.  /*
25010 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
25020 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
25030 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
25040 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
25050 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
25060 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
25070 69 7a 65 56 61 6c 69 64 20 3d 20 28 75 38 29 6d  izeValid = (u8)m
25080 65 6d 44 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65  emDb;.  /* pPage
25090 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
250a0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
250b0 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
250c0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
250d0 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
250e0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
250f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
25100 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
25110 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
25120 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
25130 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25140 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69  state == (tempFi
25150 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55  le ? PAGER_EXCLU
25160 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c  SIVE : PAGER_UNL
25170 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61  OCK) );.  /* pPa
25180 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
25190 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
251a0 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
251b0 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
251c0 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
251d0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
251e0 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
251f0 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
25200 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
25210 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
25220 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
25230 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
25240 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
25250 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
25260 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
25270 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
25280 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
25290 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
252a0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
252b0 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
252c0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
252d0 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
252e0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64   /* pPager->need
252f0 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61  Sync = 0; */.  a
25300 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61  ssert( useJourna
25310 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  l || pPager->tem
25320 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65  pFile );.  pPage
25330 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
25340 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
25350 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
25360 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
25370 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72  c ?0:1;.  pPager
25380 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53  ->sync_flags = S
25390 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
253a0 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  L;.  /* pPager->
253b0 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
253c0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
253d0 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
253e0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
253f0 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
25400 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28  ager->nExtra = (
25410 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50  u16)nExtra;.  pP
25420 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
25430 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f  eLimit = SQLITE_
25440 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f  DEFAULT_JOURNAL_
25450 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73  SIZE_LIMIT;.  as
25460 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
25470 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70  ger->fd) || temp
25480 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63  File );.  setSec
25490 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
254a0 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e  .  if( !useJourn
254b0 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  al ){.    pPager
254c0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
254d0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
254e0 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69  E_OFF;.  }else i
254f0 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  f( memDb ){.    
25500 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
25510 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
25520 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
25530 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
25540 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
25550 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
25560 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
25570 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  rg = 0; */.  pPa
25580 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
25590 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d   xReinit;.  /* m
255a0 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
255b0 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
255c0 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
255d0 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  */..  *ppPager =
255e0 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
255f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
25600 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25610 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
25620 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
25630 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
25640 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
25650 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
25660 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
25670 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
25680 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
25690 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
256a0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
256b0 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
256c0 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
256d0 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
256e0 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
256f0 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
25700 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
25710 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
25720 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
25730 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
25740 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
25750 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
25760 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
25770 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
25780 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
25790 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
257a0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
257b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
257c0 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
257d0 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
257e0 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
257f0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
25800 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
25810 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
25820 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
25830 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
25840 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
25850 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
25860 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
25870 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
25880 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
25890 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
258a0 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
258b0 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
258c0 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
258d0 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
258e0 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
258f0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
25900 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
25910 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
25920 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
25930 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
25940 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
25950 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
25960 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
25970 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
25980 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
25990 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
259a0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
259b0 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
259c0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
259d0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
259e0 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
259f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
25a00 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
25a10 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
25a20 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
25a30 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
25a40 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
25a50 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
25a60 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
25a70 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
25a80 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
25a90 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
25aa0 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
25ab0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
25ac0 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
25ad0 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
25ae0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
25af0 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
25b00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
25b10 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
25b20 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
25b30 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
25b40 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
25b50 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
25b60 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
25b70 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
25b80 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
25b90 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
25ba0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
25bb0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
25bc0 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
25bd0 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
25be0 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
25bf0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
25c00 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
25c10 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
25c20 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
25c30 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
25c40 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
25c50 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
25c60 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
25c70 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
25c80 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
25c90 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
25ca0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
25cb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25cc0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
25cd0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
25ce0 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20  int exists = 1; 
25cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d00 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
25d10 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
25d20 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c  nt */.  int jrnl
25d30 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28  Open = !!isOpen(
25d40 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20  pPager->jfd);.. 
25d50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
25d60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
25d70 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
25d80 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
25d90 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
25da0 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
25db0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d  pPager->state <=
25dc0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b   PAGER_SHARED );
25dd0 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
25de0 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
25df0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
25e00 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
25e10 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
25e20 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
25e30 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
25e40 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
25e50 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
25e60 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
25e70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
25e80 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
25e90 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
25ea0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
25eb0 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
25ec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25ed0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
25ee0 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b  .    int locked;
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f00 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
25f10 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
25f20 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
25f30 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
25f40 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
25f50 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
25f60 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
25f70 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
25f80 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
25f90 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
25fa0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
25fb0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
25fc0 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
25fd0 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
25fe0 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
25ff0 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
26000 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
26010 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
26020 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
26030 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
26040 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
26050 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
26060 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
26070 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
26080 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
26090 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
260a0 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
260b0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
260c0 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
260d0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
260e0 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
260f0 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
26100 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
26110 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
26120 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
26130 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
26140 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
26150 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
26160 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
26170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26180 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
26190 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b        int nPage;
261a0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
261b0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
261c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
261d0 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  If it consists o
261e0 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20  f 0 pages,.     
261f0 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20   ** then delete 
26200 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26210 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  . See the header
26220 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66   comment above f
26230 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  or .      ** the
26240 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e   reasoning here.
26250 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73    Delete the obs
26260 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
26270 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a  le under.      *
26280 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * a RESERVED loc
26290 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20  k to avoid race 
262a0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74  conditions and t
262b0 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e  o avoid violatin
262c0 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30  g.      ** [H330
262d0 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  20]..      */.  
262e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
262f0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
26300 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
26310 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26320 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26330 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
26340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
26350 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
26360 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
26370 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
26380 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
26390 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d   RESERVED_LOCK)=
263a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
263b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
263c0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
263d0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
263e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
263f0 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
26400 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
26410 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
26420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26430 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
26440 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
26450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26460 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
26470 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
26480 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  and no other con
26490 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65  nection has a re
264a0 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20  served.         
264b0 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c   ** or greater l
264c0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
264d0 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68  ase file. Now ch
264e0 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
264f0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
26500 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d  t least one non-
26510 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
26520 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
26530 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
26540 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
26550 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63  re is, then we c
26560 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75  onsider this jou
26570 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20  rnal to be hot. 
26580 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20  If not, .       
26590 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
265a0 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20  ignored..       
265b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
265c0 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
265d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
265e0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
265f0 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
26600 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
26610 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
26620 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
26630 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
26640 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
26650 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a  r->jfd, f, &f);.
26660 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26670 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26680 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26690 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20         u8 first 
266a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
266b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
266c0 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
266d0 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c   (void *)&first,
266e0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
266f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26700 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
26710 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
26720 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26730 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
26740 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
26750 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
26760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26770 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
26780 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
26790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
267a0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
267b0 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
267c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
267d0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
267e0 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
267f0 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
26800 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
26810 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
26820 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
26830 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
26840 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65   ** its has a ze
26850 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
26860 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
26870 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
26880 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
26890 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
268a0 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
268b0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
268c0 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
268d0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
268e0 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
268f0 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
26900 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
26910 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
26920 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
26930 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
26940 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
26950 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
26960 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
26970 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
26980 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
26990 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
269a0 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
269b0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
269c0 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
269d0 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
269e0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
269f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
26a00 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
26a10 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
26a20 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
26a30 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
26a40 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
26a50 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26a60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
26a70 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
26a80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26a90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26aa0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
26ab0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
26ac0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
26ad0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
26ae0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
26af0 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
26b00 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
26b10 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69  erAcquire() unti
26b20 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
26b30 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
26b40 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
26b50 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
26b60 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
26b70 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
26b80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
26b90 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
26ba0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
26bb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
26bc0 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
26bd0 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
26be0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
26bf0 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
26c00 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
26c10 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
26c20 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
26c30 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
26c40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26c50 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
26c60 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
26c70 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
26c80 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
26c90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26ca0 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
26cb0 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
26cc0 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
26cd0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
26ce0 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
26cf0 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
26d00 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
26d10 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
26d20 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
26d30 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
26d40 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
26d50 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
26d60 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
26d70 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
26d80 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
26d90 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
26da0 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
26db0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
26dc0 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
26dd0 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
26de0 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
26df0 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
26e00 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
26e10 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
26e20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
26e30 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
26e40 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
26e50 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
26e60 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
26e70 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
26e80 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
26e90 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
26ea0 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
26eb0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
26ec0 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
26ed0 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
26ee0 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
26ef0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
26f00 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
26f10 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
26f20 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
26f30 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
26f40 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
26f50 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
26f60 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  (2) above is not
26f70 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20   attempted, and 
26f80 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20  if the.** pager 
26f90 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  is in an error s
26fa0 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
26fb0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e  SQLITE_FULL when
26fc0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
26fd0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74  .** the error st
26fe0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
26ff0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69  s returned. It i
27000 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72  s permitted to r
27010 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ead the.** datab
27020 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49  ase when in SQLI
27030 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74  TE_FULL error st
27040 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ate..**.** Other
27050 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68  wise, if everyth
27060 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
27070 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
27080 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a  returned. If an.
27090 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  ** IO error occu
270a0 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
270b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
270c0 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
270d0 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
270e0 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  e or rolling bac
270f0 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
27100 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
27110 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
27120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
27130 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
27140 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
27150 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27160 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
27170 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
27180 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72  de */.  int isEr
27190 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20  rorReset = 0;   
271a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
271b0 75 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67  ue if recovering
271c0 20 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74   from error stat
271d0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
271e0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
271f0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72  called from b-tr
27200 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e  ee and only when
27210 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
27220 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ** outstanding p
27230 61 67 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ages */.  assert
27240 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
27250 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
27260 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
27270 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42   if( NEVER(MEMDB
27280 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
27290 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70  ode) ){ return p
272a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20  Pager->errCode; 
272b0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
272c0 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 61  database is in a
272d0 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e  n error-state, n
272e0 6f 77 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  ow is a chance t
272f0 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65  o clear.  ** the
27300 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20   error. Discard 
27310 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
27320 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
27330 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  and rollback.  *
27340 2a 20 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61  * any hot journa
27350 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
27360 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  stem..  */.  if(
27370 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
27380 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   ){.    if( isOp
27390 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
273a0 7c 7c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  || pPager->zJour
273b0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 73 45  nal ){.      isE
273c0 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20  rrorReset = 1;. 
273d0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
273e0 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
273f0 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f  E_OK;.    pager_
27400 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
27410 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
27420 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
27430 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
27440 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
27450 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
27460 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
27470 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
27480 4c 4f 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52  LOCK || isErrorR
27490 65 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  eset ){.    sqli
274a0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
274b0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
274c0 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48  Vfs;.    int isH
274d0 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  otJournal = 0;. 
274e0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
274f0 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
27500 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
27510 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
27520 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
27530 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
27540 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
27550 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27560 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
27570 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
27580 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
27590 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
275a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
275b0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
275c0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
275d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
275e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
275f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
27600 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
27610 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  _UNLOCK );.     
27620 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
27630 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
27640 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27650 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27660 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
27670 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20  ED_LOCK );..    
27680 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
27690 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
276a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
276b0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
276c0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
276d0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
276e0 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
276f0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
27700 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
27710 2f 0a 20 20 20 20 69 66 28 20 21 69 73 45 72 72  /.    if( !isErr
27720 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  orReset ){.     
27730 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27740 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f  >state <= PAGER_
27750 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 20 20  SHARED );.      
27760 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e  rc = hasHotJourn
27770 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f  al(pPager, &isHo
27780 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  tJournal);.     
27790 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
277a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
277b0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
277c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
277d0 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c   isErrorReset ||
277e0 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b   isHotJournal ){
277f0 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
27800 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
27810 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
27820 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
27830 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
27840 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
27850 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
27860 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
27870 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
27880 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
27890 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
278a0 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
278b0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
278c0 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
278d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
278e0 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
278f0 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
27900 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
27910 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
27920 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
27930 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
27940 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
27950 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
27960 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
27970 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
27980 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
27990 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
279a0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
279b0 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
279c0 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
279d0 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
279e0 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
279f0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
27a00 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
27a10 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
27a20 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
27a30 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
27a40 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
27a50 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
27a60 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
27a70 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
27a80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
27a90 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c  ager->state<EXCL
27aa0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
27ab0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27ac0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
27ad0 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
27ae0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
27af0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
27b10 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
27b20 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
27b30 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
27b40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27b50 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
27b60 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
27b70 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20  IVE;.      }. . 
27b80 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
27b90 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
27ba0 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
27bb0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
27bc0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63  in .      ** exc
27bd0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
27be0 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
27bf0 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
27c00 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20  ept open and.   
27c10 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75     ** possibly u
27c20 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
27c30 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
27c40 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
27c50 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73   the.      ** Os
27c60 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
27c70 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
27c80 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
27c90 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
27ca0 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74    ** a read/writ
27cb0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20  e file handle.. 
27cc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
27cd0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
27ce0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
27cf0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
27d00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
27d10 73 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61  sAccess(pVfs,pPa
27d20 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51  ger->zJournal,SQ
27d30 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
27d40 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20  TS,&res);.      
27d50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27d60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
27d70 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
27d80 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
27d90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27da0 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
27db0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
27dc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
27dd0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
27de0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
27df0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
27e00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
27e10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
27e20 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
27e30 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
27e40 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
27e50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
27e60 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
27e70 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
27e80 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
27e90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66  ==SQLITE_OK && f
27eb0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
27ec0 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  READONLY ){.    
27ed0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
27ee0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
27ef0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
27f00 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
27f10 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
27f20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27f30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
27f50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
27f60 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20  s not exist, it 
27f70 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68  usually means th
27f80 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 20  at some .       
27f90 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f       ** other co
27fa0 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64  nnection managed
27fb0 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72   to get in and r
27fc0 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f  oll it back befo
27fd0 72 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  re .            
27fe0 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  ** this connecti
27ff0 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  on obtained the 
28000 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61  exclusive lock a
28010 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20  bove. Or, it .  
28020 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79            ** may
28030 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70   mean that the p
28040 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20  ager was in the 
28050 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
28060 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
28070 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
28080 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
28090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
280a0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 2a  es not exist.  *
280b0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  /.            rc
280c0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
280d0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
280e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
280f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28100 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
28110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28120 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
28130 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
28140 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6a    /* Reset the j
28150 6f 75 72 6e 61 6c 20 73 74 61 74 75 73 20 66 69  ournal status fi
28160 65 6c 64 73 20 74 6f 20 69 6e 64 69 63 61 74 65  elds to indicate
28170 73 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e  s that we have n
28180 6f 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  o.      ** rollb
28190 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74  ack journal at t
281a0 68 69 73 20 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  his time. */.   
281b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
281c0 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
281d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
281e0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
281f0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
28200 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
28210 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
28220 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20  dr = 0;. .      
28230 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
28240 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
28250 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
28260 20 64 69 73 6b 2e 20 2a 2f 0a 20 0a 20 20 20 20   disk. */. .    
28270 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
28280 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
28290 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
282a0 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
282b0 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
282c0 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
282d0 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20  ead lock. Purge 
282e0 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65  the cache before
282f0 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e  .      ** playin
28300 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a  g back the hot-j
28310 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77  ournal so that w
28320 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77  e don't end up w
28330 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ith.      ** an 
28340 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63  inconsistent cac
28350 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f  he.  Sync the ho
28360 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t journal before
28370 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a   playing.      *
28380 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20  * it back since 
28390 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
283a0 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66   crashed and lef
283b0 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  t the hot journa
283c0 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61  l.      ** proba
283d0 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63  bly did not sync
283e0 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72   it and we are r
283f0 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79  equired to alway
28400 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20  s sync.      ** 
28410 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
28420 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61  re playing it ba
28430 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
28440 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
28450 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
28460 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
28470 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
28480 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
28490 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
284a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
284b0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
284c0 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
284d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
284e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
284f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
28500 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
28510 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
28520 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
28530 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
28540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
28550 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74  ert( (pPager->st
28560 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
28570 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  D).           ||
28580 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
28590 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
285a0 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53  r->state>PAGER_S
285b0 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a  HARED).      );.
285c0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
285d0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c  Pager->pBackup |
285e0 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  | sqlite3PcacheP
285f0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
28600 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
28610 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
28620 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
28630 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
28640 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
28650 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ile.      ** and
28660 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
28670 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
28680 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
28690 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  evious.      ** 
286a0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
286b0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
286c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
286d0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
286e0 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
286f0 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
28700 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
28710 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
28720 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
28730 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
28740 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
28750 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
28760 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
28770 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
28780 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
28790 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
287a0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
287b0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
287c0 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
287d0 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
287e0 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
287f0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
28800 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
28810 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
28820 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
28830 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
28840 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
28850 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
28860 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
28870 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
28880 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
28890 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
288a0 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
288b0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
288c0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
288d0 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
288e0 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
288f0 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
28900 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
28910 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
28920 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
28930 74 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  t nPage = 0;.   
28940 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
28950 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
28960 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
28970 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
28980 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
28990 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 0a 20 20  er, &nPage);..  
289a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
289b0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
289c0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
289d0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  errCode;.       
289e0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
289f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
28a00 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
28a10 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
28a20 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
28a30 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
28a40 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
28a50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28a60 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
28a70 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
28a80 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
28a90 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
28aa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28ab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28ac0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
28ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
28ae0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
28af0 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
28b00 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
28b10 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
28b20 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
28b30 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
28b40 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
28b50 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
28b60 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
28b70 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
28b80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
28b90 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
28ba0 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  t( pPager->exclu
28bb0 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
28bc0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
28bd0 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 20 20  _SHARED );..    
28be0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
28bf0 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65   WAL file in the
28c00 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70   file-system, op
28c10 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65  en this database
28c20 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d   in WAL.    ** m
28c30 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
28c40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
28c50 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61  nction call is a
28c60 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20   no-op..    */. 
28c70 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
28c80 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50  nWalIfPresent(pP
28c90 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 66 61 69  ager);.  }.. fai
28ca0 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
28cb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28cc0 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  /* pager_unlock(
28cd0 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
28ce0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
28cf0 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
28d00 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20  tabases. */.    
28d10 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
28d20 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
28d30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28d40 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
28d50 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
28d60 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63  ed zero, rollbac
28d70 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20  k any active.** 
28d80 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
28d90 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
28da0 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
28db0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
28dc0 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74  EXCLUSIVE when t
28dd0 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
28de0 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c  to in.** the rol
28df0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
28e00 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74  he unlock is not
28e10 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74   performed and t
28e20 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69  here is.** nothi
28e30 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  ng to rollback, 
28e40 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
28e50 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a  is a no-op..*/ .
28e60 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
28e70 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
28e80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28e90 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50 63    if( (sqlite3Pc
28ea0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
28eb0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
28ec0 29 0a 20 20 20 26 26 20 28 21 70 50 61 67 65 72  ).   && (!pPager
28ed0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
28ee0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
28ef0 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20  alOff>0) .  ){. 
28f00 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
28f10 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
28f20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
28f30 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
28f40 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
28f50 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
28f60 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
28f70 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
28f80 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
28f90 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
28fa0 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
28fb0 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
28fc0 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
28fd0 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
28fe0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
28ff0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
29000 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
29010 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
29020 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
29030 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
29040 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
29050 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
29060 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
29070 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
29080 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
29090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
290a0 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
290b0 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
290c0 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
290d0 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
290e0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
290f0 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
29100 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
29110 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
29120 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
29130 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
29140 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
29150 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
29160 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
29170 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
29180 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
29190 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
291a0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
291b0 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
291c0 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
291d0 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
291e0 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
291f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
29200 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
29210 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
29220 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
29230 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
29240 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
29250 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
29260 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
29270 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
29280 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
29290 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  if a .** non-zer
292a0 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  o value is passe
292b0 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65  d as the noConte
292c0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  nt parameter and
292d0 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
292e0 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
292f0 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
29300 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
29310 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
29320 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
29330 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
29340 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
29350 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
29360 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
29370 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
29380 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
29390 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
293a0 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
293b0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
293c0 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
293d0 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63  he page. This oc
293e0 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65  curs in two sepe
293f0 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a  rate scenarios:.
29400 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
29410 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
29420 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
29430 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
29440 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
29450 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
29460 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
29470 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
29480 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
29490 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
294a0 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62  o the cache to b
294b0 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  e filled with th
294c0 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
294d0 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
294e0 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
294f0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
29500 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
29510 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
29520 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
29530 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67  tead of.** being
29540 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
29550 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
29560 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
29570 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
29580 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
29590 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
295a0 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
295b0 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
295c0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
295d0 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
295e0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
295f0 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
29600 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
29610 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
29620 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
29630 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
29640 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
29650 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
29660 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
29670 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
29680 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
29690 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
296a0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
296b0 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
296c0 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
296d0 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
296e0 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
296f0 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
29700 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
29710 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
29720 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
29730 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
29740 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
29750 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
29760 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
29770 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
29780 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
29790 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
297a0 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
297b0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
297c0 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
297d0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
297e0 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
297f0 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
29800 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
29810 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
29820 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
29830 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
29840 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
29850 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
29860 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
29870 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
29880 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
29890 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
298a0 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
298b0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
298c0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
298d0 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
298e0 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
298f0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
29900 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
29910 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
29920 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
29930 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
29940 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
29950 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
29960 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
29970 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
29980 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
29990 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
299a0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
299b0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
299c0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
299d0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
299e0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
299f0 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
29a00 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
29a10 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
29a20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
29a30 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
29a40 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
29a50 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
29a60 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
29a70 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
29a80 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
29a90 3e 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  >PAGER_UNLOCK );
29aa0 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ..  if( pgno==0 
29ab0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
29ac0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29ad0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  T;.  }..  /* If 
29ae0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
29af0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
29b00 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
29b10 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20   immediately. . 
29b20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72   ** Otherwise, r
29b30 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20  equest the page 
29b40 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20  from the PCache 
29b50 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20  layer. */.  if( 
29b60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
29b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
29b80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
29b90 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
29ba0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
29bb0 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  rrCode;.  }else{
29bc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
29bd0 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
29be0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
29bf0 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a  no, 1, ppPage);.
29c00 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
29c10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29c20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61  /* Either the ca
29c30 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61  ll to sqlite3Pca
29c40 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72  cheFetch() retur
29c50 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20  ned an error or 
29c60 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
29c70 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20   was already in 
29c80 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
29c90 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
29ca0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  on was called.. 
29cb0 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f     ** Set pPg to
29cc0 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74   0 and jump to t
29cd0 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e  he exception han
29ce0 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50  dler.  */.    pP
29cf0 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  g = 0;.    goto 
29d00 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
29d10 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
29d20 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
29d30 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
29d40 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
29d50 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c  Pager==pPager ||
29d60 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
29d70 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  er==0 );..  if( 
29d80 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
29d90 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20  r && !noContent 
29da0 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
29db0 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68  s case the pcach
29dc0 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
29dd0 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  ns an initialize
29de0 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a  d copy of.    **
29df0 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72   the page. Retur
29e00 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65  n without furthe
29e10 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61  r ado.  */.    a
29e20 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47  ssert( pgno<=PAG
29e30 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70  ER_MAX_PGNO && p
29e40 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
29e50 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
29e60 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
29e70 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20  ger->nHit);.    
29e80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29e90 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
29ea0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
29eb0 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
29ec0 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
29ed0 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
29ee0 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
29ef0 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 20 20  alized.  */.    
29f00 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20 20 20 20 50  int nMax;..    P
29f10 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
29f20 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50  ->nMiss);.    pP
29f30 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20  g = *ppPage;.   
29f40 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
29f50 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54  Pager;..    /* T
29f60 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
29f70 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
29f80 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
29f90 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
29fa0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72      ** number gr
29fb0 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
29fc0 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c   or the unused l
29fd0 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20  ocking-page, is 
29fe0 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
29ff0 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
2a000 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
2a010 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
2a020 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
2a030 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2a040 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2a050 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
2a060 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
2a070 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2a080 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
2a090 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a  pPager, &nMax);.
2a0a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a0b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
2a0c0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
2a0d0 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
2a0e0 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 6e    if( MEMDB || n
2a0f0 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c  Max<(int)pgno ||
2a100 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69   noContent || !i
2a110 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2a120 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
2a130 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
2a140 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
2a150 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
2a160 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
2a170 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
2a180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a190 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
2a1a0 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
2a1b0 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
2a1c0 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
2a1d0 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
2a1e0 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
2a1f0 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
2a200 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
2a210 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
2a220 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
2a230 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
2a240 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
2a250 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
2a260 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
2a270 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
2a280 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
2a290 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
2a2a0 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
2a2b0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
2a2c0 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
2a2d0 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
2a2e0 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
2a2f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a300 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
2a310 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2a320 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
2a330 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2a340 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
2a350 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
2a360 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
2a370 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
2a380 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
2a390 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2a3a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
2a3b0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
2a3c0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
2a3d0 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
2a3e0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2a3f0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
2a400 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
2a410 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
2a420 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2a430 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
2a440 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
2a450 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
2a460 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
2a470 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
2a480 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
2a490 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2a4a0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
2a4b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
2a4c0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
2a4d0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
2a4e0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
2a4f0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
2a500 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a510 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
2a520 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
2a530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a540 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
2a550 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
2a560 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
2a570 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
2a580 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
2a590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a5a0 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72  K;..pager_acquir
2a5b0 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28  e_err:.  assert(
2a5c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a5d0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
2a5e0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2a5f0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Drop(pPg);.  }. 
2a600 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
2a610 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20  used(pPager);.. 
2a620 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
2a630 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a640 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
2a650 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
2a660 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
2a670 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
2a680 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
2a690 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
2a6a0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
2a6b0 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
2a6c0 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
2a6d0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
2a6e0 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e  he. Also, return
2a6f0 20 30 20 69 66 20 74 68 65 20 0a 2a 2a 20 70 61   0 if the .** pa
2a700 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
2a710 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65  UNLOCK state whe
2a720 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2a730 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72  is called,.** or
2a740 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
2a750 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
2a760 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
2a770 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  LITE_FULL..**.**
2a780 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
2a790 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
2a7a0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2a7b0 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2a7c0 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
2a7d0 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
2a7e0 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
2a7f0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
2a800 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
2a810 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
2a820 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
2a830 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
2a840 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
2a850 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
2a860 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
2a870 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
2a880 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
2a890 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
2a8a0 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
2a8b0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
2a8c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
2a8d0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
2a8e0 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
2a8f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
2a900 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2a910 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno!=0 );.  asse
2a920 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61  rt( pPager->pPCa
2a930 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  che!=0 );.  asse
2a940 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2a950 65 20 3e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e > PAGER_UNLOCK
2a960 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   );.  sqlite3Pca
2a970 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
2a980 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
2a990 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75  0, &pPg);.  retu
2a9a0 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
2a9b0 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20   Release a page 
2a9c0 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a  reference..**.**
2a9d0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
2a9e0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2a9f0 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
2aa00 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
2aa10 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
2aa20 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
2aa30 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
2aa40 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
2aa50 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
2aa60 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
2aa70 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
2aa80 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2aa90 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
2aaa0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2aab0 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
2aac0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
2aad0 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65   pPg ){.    Page
2aae0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2aaf0 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  >pPager;.    sql
2ab00 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
2ab10 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65  e(pPg);.    page
2ab20 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
2ab30 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
2ab40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2ab50 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
2ab60 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
2ab70 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
2ab80 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
2ab90 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
2aba0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
2abb0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
2abc0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
2abd0 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
2abe0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2abf0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
2ac00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
2ac10 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
2ac20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
2ac30 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
2ac40 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
2ac50 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
2ac60 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
2ac70 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
2ac80 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
2ac90 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
2aca0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
2acb0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2acc0 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
2acd0 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
2ace0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
2acf0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
2ad00 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
2ad10 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
2ad20 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
2ad30 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
2ad40 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
2ad50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2ad60 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
2ad70 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
2ad80 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
2ad90 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
2ada0 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
2adb0 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
2adc0 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
2add0 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
2ade0 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
2adf0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
2ae00 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
2ae10 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
2ae20 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2ae30 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
2ae40 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
2ae50 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
2ae60 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
2ae70 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2ae80 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
2ae90 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
2aea0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
2aeb0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2aec0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
2aed0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
2aee0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
2aef0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
2af00 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
2af10 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
2af20 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
2af30 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
2af40 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
2af50 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
2af60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2af70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2afa0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2afb0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afd0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2afe0 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2aff0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
2b000 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
2b010 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20  pPager->pVfs;   
2b020 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
2b030 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f  f vfs pointer */
2b040 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2b050 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
2b060 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61  _RESERVED );.  a
2b070 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2b080 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
2b090 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
2b0a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2b0b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2b0c0 46 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  F );.  assert( p
2b0d0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2b0e0 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
2b0f0 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
2b100 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
2b110 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b120 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
2b130 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
2b140 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
2b150 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
2b160 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
2b170 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
2b180 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
2b190 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
2b1a0 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
2b1b0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2b1c0 72 43 6f 64 65 3b 0a 0a 20 20 74 65 73 74 63 61  rCode;..  testca
2b1d0 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  se( pPager->dbSi
2b1e0 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
2b1f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2b200 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2b210 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
2b220 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2b230 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
2b240 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
2b250 42 69 74 76 65 63 43 72 65 61 74 65 28 6e 50 61  BitvecCreate(nPa
2b260 67 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ge);.  if( pPage
2b270 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
2b280 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2b290 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2b2a0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
2b2b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2b2c0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
2b2d0 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28  y open. */.  if(
2b2e0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2b2f0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  >jfd) ){.    if(
2b300 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2b310 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2b320 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
2b330 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
2b340 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
2b350 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
2b360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
2b370 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20  st int flags =  
2b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b390 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f   /* VFS flags to
2b3a0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
2b3b0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  le */.        SQ
2b3c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2b3d0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2b3e0 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
2b3f0 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  (pPager->tempFil
2b400 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28  e ? .          (
2b410 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2b420 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
2b430 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
2b440 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28  AL):.          (
2b450 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2b460 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20  _JOURNAL).      
2b470 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49    );.#ifdef SQLI
2b480 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2b490 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72 63 20  _WRITE.      rc 
2b4a0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2b4b0 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
2b4c0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2b4d0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
2b4e0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
2b4f0 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
2b500 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  r).      );.#els
2b510 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  e.      rc = sql
2b520 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2b530 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2b540 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
2b550 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69  flags, 0);.#endi
2b560 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  f.    }.    asse
2b570 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2b580 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2b590 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a  er->jfd) );.  }.
2b5a0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
2b5b0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
2b5c0 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
2b5d0 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
2b5e0 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62  en .  ** the sub
2b5f0 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
2b600 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
2b610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b620 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  ){.    /* TODO: 
2b630 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
2b640 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
2b650 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2b660 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
2b670 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2b680 62 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  bSize;.    pPage
2b690 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
2b6a0 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  d = 0;.    pPage
2b6b0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
2b6c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
2b6d0 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
2b6e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
2b6f0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
2b700 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
2b710 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2b720 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  lHdr = 0;.    rc
2b730 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
2b740 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  dr(pPager);.  }.
2b750 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2b760 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2b770 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
2b780 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
2b790 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
2b7a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
2b7b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b7c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
2b7d0 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
2b7e0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
2b7f0 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
2b800 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
2b810 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
2b820 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2b830 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
2b840 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2b850 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
2b860 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
2b870 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
2b880 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
2b890 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
2b8a0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2b8b0 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
2b8c0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
2b8d0 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
2b8e0 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
2b8f0 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
2b900 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
2b910 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
2b920 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
2b930 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
2b940 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
2b950 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
2b960 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  y or in-memory f
2b970 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75  ile and, the jou
2b980 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a  rnal file is .**
2b990 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68 61   opened if it ha
2b9a0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61  s not been alrea
2b9b0 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72  dy. For a tempor
2b9c0 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70  ary file, the op
2b9d0 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65  ening .** of the
2b9e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2b9f0 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
2ba00 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75  there is an actu
2ba10 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77  al need to .** w
2ba20 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
2ba30 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68  nal. TODO: Why h
2ba40 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  andle temporary 
2ba50 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c  files differentl
2ba60 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y?.**.** If the 
2ba70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ba80 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74  opened (or if it
2ba90 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
2baa0 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75  ), then a.** jou
2bab0 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77  rnal-header is w
2bac0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
2bad0 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a  art of it..**.**
2bae0 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
2baf0 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
2bb00 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2bb10 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  any sub-journal 
2bb20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  opened.** within
2bb30 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2bb40 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  n will be opened
2bb50 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
2bb60 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68   file. This.** h
2bb70 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20  as no effect if 
2bb80 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2bb90 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
2bba0 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  d (as it may be 
2bbb0 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  when.** running 
2bbc0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
2bbd0 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61  e) or if the tra
2bbe0 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nsaction does no
2bbf0 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73  t require a.** s
2bc00 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  ub-journal. If t
2bc10 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
2bc20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f  argument is zero
2bc30 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69  , then any requi
2bc40 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  red.** sub-journ
2bc50 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  al is implemente
2bc60 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70  d in-memory if p
2bc70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d  Pager is an in-m
2bc80 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
2bc90 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74  .** or using a t
2bca0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74  emporary file ot
2bcb0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
2bcc0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
2bcd0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
2bce0 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74   int exFlag, int
2bcf0 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a   subjInMemory){.
2bd00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2bd10 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
2bd20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
2bd30 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
2bd40 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
2bd50 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a  emory = (u8)subj
2bd60 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28  InMemory;..  if(
2bd70 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
2bd80 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
2bd90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2bda0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
2bdb0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2bdc0 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67   !MEMDB && !pPag
2bdd0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
2bde0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
2bdf0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
2be00 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2be10 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
2be20 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
2be30 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2be40 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
2be50 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
2be60 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2be70 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
2be80 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
2be90 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
2bea0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
2beb0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
2bec0 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
2bed0 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
2bee0 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
2bef0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2bf00 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
2bf10 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
2bf20 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70  LOCK);.        p
2bf30 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2bf40 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
2bf50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2bf60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bf70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2bf80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bf90 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
2bfa0 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
2bfb0 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20  >pWal, 1);.     
2bfc0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61   }..      /* Gra
2bfd0 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  b the write lock
2bfe0 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   on the log file
2bff0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
2c000 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20   upgrade to.    
2c010 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52    ** PAGER_RESER
2c020 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72  VED state. Other
2c030 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
2c040 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
2c050 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
2c060 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64  ** The busy-hand
2c070 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b  ler is not invok
2c080 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f  ed if another co
2c090 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  nnection already
2c0a0 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  .      ** holds 
2c0b0 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20  the write-lock. 
2c0c0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  If possible, the
2c0d0 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
2c0e0 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20  l call it..     
2c0f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c   **.      ** WAL
2c100 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65 72   mode sets Pager
2c110 2e 73 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f  .state to PAGER_
2c120 52 45 53 45 52 56 45 44 20 77 68 65 6e 20 69 74  RESERVED when it
2c130 20 68 61 73 20 61 6e 20 6f 70 65 6e 0a 20 20 20   has an open.   
2c140 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
2c150 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20  n, but never to 
2c160 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e  PAGER_EXCLUSIVE.
2c170 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
2c180 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 50 41   in .      ** PA
2c190 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74  GER_EXCLUSIVE st
2c1a0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2c1b0 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f  roll back savepo
2c1c0 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  int transactions
2c1d0 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  .      ** may co
2c1e0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
2c1f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
2c200 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2c210 69 6c 65 20 61 73 20 77 65 6c 6c 0a 20 20 20 20  ile as well.    
2c220 20 20 2a 2a 20 61 73 20 69 6e 74 6f 20 74 68 65    ** as into the
2c230 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69   page cache. Whi
2c240 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f  ch would be inco
2c250 72 72 65 63 74 20 69 6e 20 57 41 4c 20 6d 6f 64  rrect in WAL mod
2c260 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2c270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
2c280 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
2c290 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
2c2a0 57 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Wal);.      if( 
2c2b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c2c0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2c2d0 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50  >dbOrigSize = pP
2c2e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
2c2f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
2c300 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
2c310 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 70 50  RVED;.        pP
2c320 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2c330 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
2c340 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
2c350 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
2c360 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
2c370 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
2c380 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2c390 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
2c3a0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
2c3b0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
2c3c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2c3d0 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   Obtain a RESERV
2c3e0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
2c3f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
2c400 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61   the exFlag para
2c410 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  meter.      ** i
2c420 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d  s true, then imm
2c430 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65  ediately upgrade
2c440 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c   this to an EXCL
2c450 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
2c460 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61        ** busy-ha
2c470 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63  ndler callback c
2c480 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  an be used when 
2c490 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65  upgrading to the
2c4a0 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20   EXCLUSIVE.     
2c4b0 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f   ** lock, but no
2c4c0 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67  t when obtaining
2c4d0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
2c4e0 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
2c4f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2c500 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
2c510 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
2c520 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2c530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c540 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
2c550 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
2c560 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  VED;.        if(
2c570 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
2c580 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2c590 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
2c5a0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
2c5b0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
2c5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2c5d0 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
2c5e0 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
2c5f0 6c 20 66 69 6c 65 20 61 74 20 74 68 69 73 20 74  l file at this t
2c600 69 6d 65 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ime.  It will be
2c610 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20 62  .    ** opened b
2c620 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
2c630 74 65 6e 20 74 6f 2e 20 20 49 66 20 77 65 20 64  ten to.  If we d
2c640 65 66 65 72 20 6f 70 65 6e 69 6e 67 20 74 68 65  efer opening the
2c650 20 6a 6f 75 72 6e 61 6c 2c 0a 20 20 20 20 2a 2a   journal,.    **
2c660 20 77 65 20 6d 69 67 68 74 20 73 61 76 65 20 74   we might save t
2c670 68 65 20 77 6f 72 6b 20 6f 66 20 63 72 65 61 74  he work of creat
2c680 69 6e 67 20 61 20 66 69 6c 65 20 69 66 20 74 68  ing a file if th
2c690 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
2c6a0 20 20 2a 2a 20 65 6e 64 73 20 75 70 20 62 65 69    ** ends up bei
2c6b0 6e 67 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  ng a no-op..    
2c6c0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d  */..    if( rc!=
2c6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c6e0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2c6f0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2c700 3b 0a 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72  ;.      /* Ignor
2c710 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 74  e any IO error t
2c720 68 61 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  hat occurs withi
2c730 6e 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  n pager_end_tran
2c740 73 61 63 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20  saction(). The. 
2c750 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 20       ** purpose 
2c760 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  of this call is 
2c770 74 6f 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  to reset the int
2c780 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
2c790 68 65 20 70 61 67 65 72 0a 20 20 20 20 20 20 2a  he pager.      *
2c7a0 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e 20 49 74  * sub-system. It
2c7b0 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
2c7c0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  if the journal-f
2c7d0 69 6c 65 20 69 73 20 6e 6f 74 20 70 72 6f 70 65  ile is not prope
2c7e0 72 6c 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e  rly.      ** fin
2c7f0 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73 20 70  alized at this p
2c800 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74 20 69  oint (since it i
2c810 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6a 6f  s not a valid jo
2c820 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79 77 61  urnal file anywa
2c830 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  y)..      */.   
2c840 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
2c850 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
2c860 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
2c870 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
2c880 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
2c890 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2c8a0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
2c8b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
2c8c0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61  a single data pa
2c8d0 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
2c8e0 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
2c8f0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
2c900 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f  * main journal o
2c910 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73  r sub-journal as
2c920 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68   required. If th
2c930 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
2c940 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66  n into.** one of
2c950 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74   the journals, t
2c960 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2c970 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74   bit is set in t
2c980 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  he .** Pager.pIn
2c990 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61  Journal bitvec a
2c9a0 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
2c9b0 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
2c9c0 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66  nt bitvecs.** of
2c9d0 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f   any open savepo
2c9e0 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69  ints as appropri
2c9f0 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
2ca00 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
2ca10 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f  gHdr *pPg){.  vo
2ca20 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
2ca30 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20  >pData;.  Pager 
2ca40 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
2ca50 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
2ca60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2ca70 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
2ca80 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e  is not called un
2ca90 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
2caa0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
2cab0 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72 74 65 64  een.  ** started
2cac0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2cad0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2cae0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
2caf0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
2cb00 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65  ror has been pre
2cb10 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64  viously detected
2cb20 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d  , report the sam
2cb30 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61  e error.  ** aga
2cb40 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  in..  */.  if( N
2cb50 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
2cb60 43 6f 64 65 29 20 29 20 20 72 65 74 75 72 6e 20  Code) )  return 
2cb70 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2cb80 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65  ..  /* Higher-le
2cb90 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76  vel routines nev
2cba0 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  er call this fun
2cbb0 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73  ction if databas
2cbc0 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72  e is not.  ** wr
2cbd0 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65  itable.  But che
2cbe0 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20  ck anyway, just 
2cbf0 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20  for robustness. 
2cc00 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2cc10 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29  Pager->readOnly)
2cc20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2cc30 5f 50 45 52 4d 3b 0a 0a 20 20 61 73 73 65 72 74  _PERM;..  assert
2cc40 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
2cc50 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b  ster );..  CHECK
2cc60 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
2cc70 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
2cc80 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
2cc90 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
2cca0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
2ccb0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
2ccc0 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
2ccd0 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
2cce0 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
2ccf0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
2cd00 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67  (pPg);.  if( pag
2cd10 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
2cd20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  && !subjRequires
2cd30 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
2cd40 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
2cd50 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
2cd60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
2cd70 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d  odified = 1;.  }
2cd80 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
2cd90 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
2cda0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
2cdb0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
2cdc0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
2cdd0 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
2cde0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
2cdf0 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
2ce00 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
2ce10 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
2ce20 20 20 20 20 2a 2a 20 48 69 67 68 65 72 20 6c 65      ** Higher le
2ce30 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 73 68 6f  vel routines sho
2ce40 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
2ce50 20 73 74 61 72 74 65 64 20 61 20 74 72 61 6e 73   started a trans
2ce60 61 63 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a 20 77  action,.    ** w
2ce70 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 79 20  hich means they 
2ce80 68 61 76 65 20 61 63 71 75 69 72 65 64 20 74 68  have acquired th
2ce90 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b  e necessary lock
2cea0 73 20 62 75 74 20 74 68 65 20 72 6f 6c 6c 62 61  s but the rollba
2ceb0 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  ck.    ** journa
2cec0 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20  l might not yet 
2ced0 62 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2f 0a  be open..    */.
2cee0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2cef0 65 72 2d 3e 73 74 61 74 65 3e 3d 52 45 53 45 52  er->state>=RESER
2cf00 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
2cf10 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
2cf20 6f 75 72 6e 61 6c 3d 3d 30 0a 20 20 20 20 20 26  ournal==0.     &
2cf30 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2cf40 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2cf50 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
2cf60 20 20 20 26 26 20 21 70 61 67 65 72 55 73 65 57     && !pagerUseW
2cf70 61 6c 28 70 50 61 67 65 72 29 0a 20 20 20 20 29  al(pPager).    )
2cf80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2cf90 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2cfa0 61 6c 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  al );.      rc =
2cfb0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
2cfc0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
2cfd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cfe0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
2cff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
2d000 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
2d010 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
2d020 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
2d030 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
2d040 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
2d050 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
2d060 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
2d070 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
2d080 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
2d090 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
2d0a0 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
2d0b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2d0c0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
2d0d0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
2d0e0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
2d0f0 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
2d100 61 6c 28 70 50 67 29 20 26 26 20 69 73 4f 70 65  al(pPg) && isOpe
2d110 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2d120 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2d130 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
2d140 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ger) );.      if
2d150 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  ( pPg->pgno<=pPa
2d160 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2d170 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  ){.        u32 c
2d180 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68  ksum;.        ch
2d190 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20  ar *pData2;..   
2d1a0 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
2d1b0 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
2d1c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d1d0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
2d1e0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
2d1f0 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
2d200 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
2d210 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
2d220 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a  rifies.        *
2d230 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
2d240 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
2d250 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
2d260 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
2d270 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20  ager) );..      
2d280 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2d290 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20  ->journalHdr <= 
2d2a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2d2b0 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  ff );.        CO
2d2c0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
2d2d0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
2d2e0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2d2f0 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
2d300 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
2d310 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
2d320 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
2d330 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
2d340 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
2d350 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
2d360 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d  journalOff, pPg-
2d370 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
2d380 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d390 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2d3a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
2d3b0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
2d3c0 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
2d3d0 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2d400 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b  journalOff + 4);
2d410 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2d420 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
2d430 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2d440 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e+4;.        }. 
2d450 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2d460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d470 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
2d480 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
2d490 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
2d4a0 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a  nalOff, cksum);.
2d4b0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2d4c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
2d4d0 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
2d4e0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
2d4f0 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
2d500 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
2d510 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
2d520 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
2d530 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
2d540 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
2d550 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
2d560 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
2d570 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
2d580 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
2d590 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20  TRACE(("JOURNAL 
2d5a0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
2d5b0 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
2d5c0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
2d5d0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
2d5e0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
2d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
2d600 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2d610 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c  NEED_SYNC)?1:0),
2d620 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
2d630 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20  pPg)));..       
2d640 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49   /* Even if an I
2d650 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72  O or diskfull er
2d660 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68 69  ror occurred whi
2d670 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74  le journalling t
2d680 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
2d690 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  ge in the block 
2d6a0 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e  above, set the n
2d6b0 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f  eed-sync flag fo
2d6c0 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  r the page..    
2d6d0 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
2d6e0 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  , when the trans
2d6f0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
2d700 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63   back, the logic
2d710 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   in.        ** p
2d720 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
2d730 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68  () will think th
2d740 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
2d750 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
2d760 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
2d770 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d780 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65  . And if an IO e
2d790 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2d7a0 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20  e doing so,.    
2d7b0 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72      ** then corr
2d7c0 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f  uption may follo
2d7d0 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
2d7e0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2d7f0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2d800 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
2d810 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
2d820 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
2d830 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2d840 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2d850 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  .        /* An e
2d860 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
2d870 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
2d880 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
2d890 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  he .        ** t
2d8a0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
2d8b0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
2d8c0 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76  y the layer abov
2d8d0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
2d8e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d8f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d900 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d910 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2d920 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
2d930 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
2d940 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
2d950 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
2d960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d970 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
2d980 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
2d990 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
2d9a0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
2d9b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
2d9c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d9d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
2d9e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
2d9f0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  M );.        rc 
2da00 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  |= addToSavepoin
2da10 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
2da20 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
2da30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2da40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2da50 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2da60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
2da70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2da80 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2da90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2daa0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
2dab0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
2dac0 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
2dad0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2dae0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
2daf0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
2db00 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2db10 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
2db20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2db30 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50   PAGERTRACE(("AP
2db40 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
2db50 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
2db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db70 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2db80 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
2db90 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
2dba0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2dbb0 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b  ED_SYNC)?1:0)));
2dbc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2dbd0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
2dbe0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
2dbf0 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
2dc00 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
2dc10 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
2dc20 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
2dc30 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
2dc40 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
2dc50 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
2dc60 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
2dc70 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
2dc80 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
2dc90 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
2dca0 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
2dcb0 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
2dcc0 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
2dcd0 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
2dce0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
2dcf0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
2dd00 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pPg) ){.      rc
2dd10 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
2dd20 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
2dd30 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
2dd40 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
2dd50 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
2dd60 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
2dd70 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
2dd80 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28  _SHARED );.  if(
2dd90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
2dda0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
2ddb0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2ddc0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d  = pPg->pgno;.  }
2ddd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2dde0 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
2ddf0 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
2de00 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69  able. This routi
2de10 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
2de20 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b  d before .** mak
2de30 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ing changes to a
2de40 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65   page. The calle
2de50 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  r must check the
2de60 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a   return value .*
2de70 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  * of this functi
2de80 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  on and be carefu
2de90 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20  l not to change 
2dea0 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
2deb0 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f  less .** this ro
2dec0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
2ded0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
2dee0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2def0 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
2df00 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
2df10 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
2df20 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
2df30 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
2df40 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
2df50 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
2df60 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
2df70 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
2df80 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
2df90 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
2dfa0 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
2dfb0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2dfc0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2dfd0 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
2dfe0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
2dff0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2e000 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
2e010 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
2e020 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
2e030 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ** as appropriat
2e040 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
2e050 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
2e060 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2e070 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
2e080 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
2e090 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
2e0a0 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
2e0b0 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
2e0c0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2e0d0 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
2e0e0 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
2e0f0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
2e100 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
2e110 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72  ..  if( nPagePer
2e120 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
2e130 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
2e140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
2e150 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
2e160 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
2e170 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
2e180 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
2e190 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
2e1a0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
2e1b0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
2e1c0 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
2e1d0 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Page = 0;       
2e1e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2e1f0 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
2e200 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
2e210 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
2e220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e230 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2e240 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
2e250 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20  eedSync = 0;    
2e260 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2e270 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48  any page has PGH
2e280 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a  DR_NEED_SYNC */.
2e290 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
2e2a0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66  doNotSyncSpill f
2e2b0 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
2e2c0 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
2e2d0 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a  not allow.    **
2e2e0 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
2e2f0 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
2e300 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
2e310 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20  s journaled by. 
2e320 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2e330 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
2e340 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
2e350 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2e360 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
2e370 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pill==0 );.    p
2e380 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
2e390 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  Spill++;..    /*
2e3a0 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
2e3b0 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
2e3c0 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
2e3d0 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
2e3e0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
2e3f0 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
2e400 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
2e410 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
2e420 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
2e430 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
2e440 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
2e450 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
2e460 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
2e470 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
2e480 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
2e490 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
2e4a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2e4b0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2e4c0 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65  r, (int *)&nPage
2e4d0 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  Count);.    if( 
2e4e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e4f0 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
2e500 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
2e510 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65  ){.        nPage
2e520 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
2e530 70 67 31 29 2b 31 3b 0a 20 20 20 20 20 20 7d 65  pg1)+1;.      }e
2e540 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
2e550 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
2e560 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
2e570 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
2e580 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
2e590 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e5a0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
2e5b0 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
2e5c0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2e5d0 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 20  (nPage>0);.     
2e5e0 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
2e5f0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61  ->pgno);.      a
2e600 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65  ssert((pg1+nPage
2e610 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  )>pPg->pgno);.  
2e620 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d    }..    for(ii=
2e630 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
2e640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
2e650 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
2e660 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
2e670 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
2e680 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70  .      if( pg==p
2e690 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c  Pg->pgno || !sql
2e6a0 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
2e6b0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2e6c0 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20  l, pg) ){.      
2e6d0 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
2e6e0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
2e6f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2e700 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2e710 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
2e720 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2e730 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e740 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2e750 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
2e760 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
2e770 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2e780 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2e790 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
2e7a0 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
2e7b0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
2e7c0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
2e7d0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
2e7e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e7f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e800 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
2e810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2e820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e830 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
2e840 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
2e850 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
2e860 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
2e870 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
2e880 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
2e890 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
2e8a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2e8b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2e8c0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
2e8d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e8e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
2e8f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2e900 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61  lag is set for a
2e910 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20  ny of the nPage 
2e920 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74  pages .    ** st
2e930 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74  arting at pg1, t
2e940 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20  hen it needs to 
2e950 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f  be set for all o
2e960 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a  f them. Because.
2e970 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74      ** writing t
2e980 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e  o any of these n
2e990 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64  Page pages may d
2e9a0 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73  amage the others
2e9b0 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  , the.    ** jou
2e9c0 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63  rnal file must c
2e9d0 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20  ontain sync()ed 
2e9e0 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66  copies of all of
2e9f0 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66   them.    ** bef
2ea00 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  ore any of them 
2ea10 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
2ea20 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2ea30 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
2ea40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ea50 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e  TE_OK && needSyn
2ea60 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
2ea70 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  t( !MEMDB && pPa
2ea80 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29  ger->noSync==0 )
2ea90 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
2eaa0 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b  ; ii<nPage; ii++
2eab0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
2eac0 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   *pPage = pager_
2ead0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
2eae0 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20  g1+ii);.        
2eaf0 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
2eb00 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c         pPage->fl
2eb10 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
2eb20 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
2eb30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2eb40 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
2eb50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2eb60 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
2eb70 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r->needSync);.  
2eb80 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
2eb90 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
2eba0 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20  ncSpill==1 );.  
2ebb0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
2ebc0 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65  yncSpill--;.  }e
2ebd0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
2ebe0 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
2ebf0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
2ec00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2ec10 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2ec20 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
2ec30 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
2ec40 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
2ec50 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
2ec60 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
2ec70 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
2ec80 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
2ec90 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
2eca0 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
2ecb0 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
2ecc0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
2ecd0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
2ece0 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
2ecf0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
2ed00 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2ed10 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
2ed20 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
2ed30 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
2ed40 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
2ed50 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
2ed60 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
2ed70 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
2ed80 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
2ed90 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
2eda0 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
2edb0 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
2edc0 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
2edd0 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70  irty.  This happ
2ede0 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
2edf0 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61  , when.** the pa
2ee00 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65  ge has been adde
2ee10 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74  d as a leaf of t
2ee20 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
2ee30 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  so its.** conten
2ee40 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74  t no longer matt
2ee50 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ers..**.** The o
2ee60 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
2ee70 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
2ee80 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
2ee90 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
2eea0 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
2eeb0 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
2eec0 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
2eed0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
2eee0 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
2eef0 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
2ef00 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
2ef10 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
2ef20 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
2ef30 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75  ation can quadru
2ef40 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
2ef50 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54   large .** DELET
2ef60 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f  E operations..*/
2ef70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
2ef80 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64  erDontWrite(PgHd
2ef90 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
2efa0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2efb0 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70  pPager;.  if( (p
2efc0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2efd0 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72  DIRTY) && pPager
2efe0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
2eff0 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
2f000 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E(("DONT_WRITE p
2f010 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
2f020 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
2f030 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2f040 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
2f050 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
2f060 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
2f070 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
2f080 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  |= PGHDR_DONT_WR
2f090 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ITE;.#ifdef SQLI
2f0a0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
2f0b0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
2f0c0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
2f0d0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
2f0e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2f0f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2f100 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
2f110 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2f120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a   database file .
2f130 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  ** change-counte
2f140 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34  r, stored as a 4
2f150 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2f160 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e   integer startin
2f170 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66  g at .** byte of
2f180 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70  fset 24 of the p
2f190 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  ager file..**.**
2f1a0 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74   If the isDirect
2f1b0 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72  Mode flag is zer
2f1c0 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
2f1d0 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
2f1e0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2f1f0 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20  Write() on page 
2f200 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e  1, then modifyin
2f210 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2f220 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  f the.** page da
2f230 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ta. In this case
2f240 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   the file will b
2f250 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74  e updated when t
2f260 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
2f270 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
2f280 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
2f290 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
2f2a0 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  lag may only be 
2f2b0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
2f2c0 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
2f2d0 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  iled.** with the
2f2e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2f2f0 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72  TOMIC_WRITE macr
2f300 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68  o defined. In th
2f310 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69  is case,.** if i
2f320 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a  sDirect is non-z
2f330 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61  ero, then the da
2f340 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
2f350 70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a  pdated directly.
2f360 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e  ** by writing an
2f370 20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e   updated version
2f380 20 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67   of page 1 using
2f390 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a   a call to the .
2f3a0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  ** sqlite3OsWrit
2f3b0 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  e() function..*/
2f3c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2f3d0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2f3e0 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
2f3f0 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
2f400 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Mode){.  int rc 
2f410 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2f420 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69  /* Declare and i
2f430 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61  nitialize consta
2f440 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69  nt integer 'isDi
2f450 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20  rect'. If the.  
2f460 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  ** atomic-write 
2f470 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2f480 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20  enabled in this 
2f490 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69  build, then isDi
2f4a0 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69  rect.  ** is ini
2f4b0 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
2f4c0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
2f4d0 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  the isDirectMode
2f4e0 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20   parameter.  ** 
2f4f0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2f500 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2f510 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
2f520 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   zero..  **.  **
2f530 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
2f540 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  t if the atomic-
2f550 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2f560 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65  on is not.  ** e
2f570 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
2f580 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70  e time, the comp
2f590 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68  iler can omit th
2f5a0 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20  e tests of.  ** 
2f5b0 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77  'isDirect' below
2f5c0 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  , as well as the
2f5d0 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20   block enclosed 
2f5e0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28  in the.  ** "if(
2f5f0 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e   isDirect )" con
2f600 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  dition..  */.#if
2f610 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
2f620 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2f630 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
2f640 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28  MODE 0.  assert(
2f650 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30   isDirectMode==0
2f660 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
2f670 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d  AMETER(isDirectM
2f680 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65  ode);.#else.# de
2f690 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45  fine DIRECT_MODE
2f6a0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65   isDirectMode.#e
2f6b0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
2f6c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2f6d0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
2f6e0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
2f6f0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2f700 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
2f710 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  e>0 ){.    PgHdr
2f720 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20   *pPgHdr;       
2f730 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
2f740 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
2f750 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67  */.    u32 chang
2f760 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  e_counter;      
2f770 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2f780 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d  value of change-
2f790 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f  counter field */
2f7a0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ..    assert( !p
2f7b0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2f7c0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2f7d0 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ->fd) );..    /*
2f7e0 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
2f7f0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
2f800 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
2f810 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2f820 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
2f830 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  gHdr);.    asser
2f840 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20  t( pPgHdr==0 || 
2f850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2f860 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65  ..    /* If page
2f870 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64   one was fetched
2f880 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61   successfully, a
2f890 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
2f8a0 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f   is not.    ** o
2f8b0 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65  perating in dire
2f8c0 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61  ct-mode, make pa
2f8d0 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20  ge 1 writable.  
2f8e0 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20  When not in .   
2f8f0 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   ** direct mode,
2f900 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61 79   page 1 is alway
2f910 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20  s held in cache 
2f920 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50 61  and hence the Pa
2f930 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a 20  gerGet().    ** 
2f940 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73 20  above is always 
2f950 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65 6e  successful - hen
2f960 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f 6e  ce the ALWAYS on
2f970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a   rc==SQLITE_OK..
2f980 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
2f990 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20 41  DIRECT_MODE && A
2f9a0 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54 45  LWAYS(rc==SQLITE
2f9b0 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  _OK) ){.      rc
2f9c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2f9d0 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
2f9e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
2f9f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fa00 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
2fa10 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
2fa20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
2fa30 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
2fa40 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e  4. */.      chan
2fa50 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
2fa60 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
2fa70 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
2fa80 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61  Vers);.      cha
2fa90 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
2faa0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
2fab0 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
2fac0 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
2fad0 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  _counter);..    
2fae0 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20    /* Also store 
2faf0 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
2fb00 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74  on number in byt
2fb10 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e  es 96..99 and in
2fb20 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
2fb30 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65  92..95 store the
2fb40 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
2fb50 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65  for which the ve
2fb60 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 20  rsion number.   
2fb70 20 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20     ** is valid. 
2fb80 2a 2f 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  */.      put32bi
2fb90 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
2fba0 72 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68  r->pData)+92, ch
2fbb0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
2fbc0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
2fbd0 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
2fbe0 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45  Data)+96, SQLITE
2fbf0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29  _VERSION_NUMBER)
2fc00 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ;..      /* If r
2fc10 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74  unning in direct
2fc20 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65   mode, write the
2fc30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
2fc40 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  e 1 to the file.
2fc50 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49   */.      if( DI
2fc60 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20  RECT_MODE ){.   
2fc70 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
2fc80 2a 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20 61  *zBuf;.        a
2fc90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
2fca0 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20  bFileSize>0 );. 
2fcb0 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
2fcc0 61 67 65 72 2c 20 70 50 67 48 64 72 2d 3e 70 44  ager, pPgHdr->pD
2fcd0 61 74 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51  ata, 1, 6, rc=SQ
2fce0 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66  LITE_NOMEM, zBuf
2fcf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2fd00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fd10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2fd20 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2fd30 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
2fd40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2fd50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
2fd60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2fd70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fd80 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
2fd90 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2fda0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2fdb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fdc0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
2fdd0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
2fde0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2fdf0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
2fe00 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
2fe10 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
2fe20 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
2fe30 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
2fe40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
2fe50 6e 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  nc the pager fil
2fe60 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20  e to disk. This 
2fe70 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69  is a no-op for i
2fe80 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a  n-memory files.*
2fe90 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20  * or pages with 
2fea0 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
2feb0 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
2fec0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2fed0 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70  or called on a p
2fee0 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69  ager for which i
2fef0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68  t is a no-op, th
2ff00 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
2ff10 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2ff20 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
2ff30 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2ff40 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2ff50 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  t sqlite3PagerSy
2ff60 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
2ff70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
2ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2ffa0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
2ffb0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
2ffc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
2ffd0 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
2ffe0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2fff0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
30000 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
30010 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
30020 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d  sync_flags);.  }
30030 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30040 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
30050 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
30060 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
30070 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
30080 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
30090 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
300a0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
300b0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
300c0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
300d0 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
300e0 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
300f0 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
30100 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
30110 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
30120 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
30130 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
30140 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
30150 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
30160 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ures that:.**.**
30170 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
30180 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
30190 75 6e 74 65 72 20 69 73 20 75 70 64 61 74 65 64  unter is updated
301a0 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75  ,.**   * the jou
301b0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28  rnal is synced (
301c0 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69  unless the atomi
301d0 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
301e0 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a  tion is used),.*
301f0 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20  *   * all dirty 
30200 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
30210 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
30220 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20  e file, .**   * 
30230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30240 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 28  e is truncated (
30250 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e  if required), an
30260 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  d.**   * the dat
30270 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
30280 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  d. .**.** The on
30290 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20 72 65  ly thing that re
302a0 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
302b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
302c0 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a  is to finalize .
302d0 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e  ** (delete, trun
302e0 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
302f0 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 29 20   first part of) 
30300 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30310 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20   (or .** delete 
30320 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
30330 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
30340 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
30350 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
30360 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
30370 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
30380 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
30390 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
303a0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
303b0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
303c0 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  all..**.** If th
303d0 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
303e0 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20  r - noSync - is 
303f0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
30400 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
30410 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79  elf.** is not sy
30420 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  nced. The caller
30430 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74   must call sqlit
30440 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69  e3PagerSync() di
30450 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e  rectly to.** syn
30460 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
30470 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
30480 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  ng CommitPhaseTw
30490 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68  o() to delete th
304a0 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
304b0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
304c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
304d0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
304e0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
304f0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
30500 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
30510 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
30520 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20  char *zMaster,  
30530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
30540 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61  not NULL, the ma
30550 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
30560 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e  e */.  int noSyn
30570 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
30580 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
30590 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63  o omit the xSync
305a0 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
305b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
305c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
305d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
305e0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
305f0 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 69  The dbOrigSize i
30600 73 20 6e 65 76 65 72 20 73 65 74 20 69 66 20 6a  s never set if j
30610 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20  ournal_mode=OFF 
30620 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
30630 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
30640 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
30650 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 50 61 67 65  ODE_OFF || pPage
30660 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30  r->dbOrigSize==0
30670 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70   );..  /* If a p
30680 72 69 6f 72 20 65 72 72 6f 72 20 6f 63 63 75 72  rior error occur
30690 72 65 64 2c 20 72 65 70 6f 72 74 20 74 68 61 74  red, report that
306a0 20 65 72 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f   error again. */
306b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
306c0 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20  rrCode ) return 
306d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
306e0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
306f0 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
30700 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
30710 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20  %s nSize=%d\n", 
30720 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
30730 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
30740 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
30750 65 29 29 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  e));..  if( MEMD
30760 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  B && pPager->dbM
30770 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20 20 2f  odified ){.    /
30780 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
30790 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
307a0 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
307b0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
307c0 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66  or this.    ** f
307d0 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
307e0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
307f0 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20   it is mostly a 
30800 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c  no-op.  However,
30810 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b   any.    ** back
30820 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e  up in progress n
30830 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 61  eeds to be resta
30840 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rted..    */.   
30850 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
30860 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
30870 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 20  ackup);.  }else 
30880 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
30890 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
308a0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  && pPager->dbMod
308b0 69 66 69 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ified ){.    if(
308c0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
308d0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50 67  ger) ){.      Pg
308e0 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  Hdr *pList = sql
308f0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
30900 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
30910 63 68 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  che);.      if( 
30920 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
30930 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
30940 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 4c 69  ames(pPager, pLi
30950 73 74 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  st, pPager->dbSi
30960 7a 65 2c 20 31 2c 20 0a 20 20 20 20 20 20 20 20  ze, 1, .        
30970 20 20 20 20 28 70 50 61 67 65 72 2d 3e 66 75 6c      (pPager->ful
30980 6c 53 79 6e 63 20 3f 20 70 50 61 67 65 72 2d 3e  lSync ? pPager->
30990 73 79 6e 63 5f 66 6c 61 67 73 20 3a 20 30 29 0a  sync_flags : 0).
309a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
309b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
309c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
309d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
309e0 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
309f0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
30a00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
30a10 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
30a20 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70  llowing block up
30a30 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
30a40 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c  -counter. Exactl
30a50 79 20 68 6f 77 20 69 74 0a 20 20 20 20 20 20 2a  y how it.      *
30a60 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65 70 65  * does this depe
30a70 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
30a80 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
30a90 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61  -update optimiza
30aa0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 61  tion.      ** wa
30ab0 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
30ac0 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69  pile time, and i
30ad0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
30ae0 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20  on meets the .  
30af0 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63      ** runtime c
30b00 72 69 74 65 72 69 61 20 74 6f 20 75 73 65 20 74  riteria to use t
30b10 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20  he operation: . 
30b20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
30b30 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73      * The file-s
30b40 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74  ystem supports t
30b50 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
30b60 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20  property for.   
30b70 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b     **      block
30b80 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73  s of size page-s
30b90 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ize, and .      
30ba0 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d  **    * This com
30bb0 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  mit is not part 
30bc0 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
30bd0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
30be0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 45  .      **    * E
30bf0 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
30c00 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
30c10 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
30c20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
30c30 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
30c40 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
30c50 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65  zation was not e
30c60 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
30c70 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65  e time, then the
30c80 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  .      ** pager_
30c90 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
30ca0 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  er() function is
30cb0 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64 61 74   called to updat
30cc0 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20 20 20  e the change.   
30cd0 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e     ** counter in
30ce0 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27   'indirect-mode'
30cf0 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  . If the optimiz
30d00 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65  ation is compile
30d10 64 20 69 6e 20 62 75 74 0a 20 20 20 20 20 20 2a  d in but.      *
30d20 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61  * is not applica
30d30 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e  ble to this tran
30d40 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71  saction, call sq
30d50 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
30d60 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  te().      ** to
30d70 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a   make sure the j
30d80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
30d90 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72  actually been cr
30da0 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c  eated, then call
30db0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  .      ** pager_
30dc0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
30dd0 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
30de0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
30df0 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20  r in indirect.  
30e00 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20      ** mode. .  
30e10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
30e20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
30e30 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
30e40 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64 20 61  s both enabled a
30e50 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20  nd applicable,. 
30e60 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c       ** then cal
30e70 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  l pager_incr_cha
30e80 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20  ngecounter() to 
30e90 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
30ea0 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 20 20  e-counter.      
30eb0 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d  ** in 'direct' m
30ec0 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
30ed0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
30ee0 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  le will never be
30ef0 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65  .      ** create
30f00 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73  d for this trans
30f10 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
30f20 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
30f30 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
30f40 52 49 54 45 0a 20 20 20 20 20 20 50 67 48 64 72  RITE.      PgHdr
30f50 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 61 73 73   *pPg;.      ass
30f60 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
30f70 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  er->jfd) .      
30f80 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
30f90 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
30fa0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
30fb0 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  FF .           |
30fc0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
30fd0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
30fe0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
30ff0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
31000 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f   !zMaster && isO
31010 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31020 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67   .       && pPag
31030 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
31040 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
31050 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 26  Pager) .       &
31060 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
31070 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  >=pPager->dbFile
31080 53 69 7a 65 0a 20 20 20 20 20 20 20 26 26 20 28  Size.       && (
31090 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65  0==(pPg = sqlite
310a0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
310b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
310c0 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44  )) || 0==pPg->pD
310d0 69 72 74 79 29 0a 20 20 20 20 20 20 29 7b 0a 20  irty).      ){. 
310e0 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65         /* Update
310f0 20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61   the db file cha
31100 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20  nge counter via 
31110 74 68 65 20 64 69 72 65 63 74 2d 77 72 69 74 65  the direct-write
31120 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20   method. The .  
31130 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
31140 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64  ng call will mod
31150 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ify the in-memor
31160 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
31170 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20 20   of page 1 .    
31180 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64      ** to includ
31190 65 20 74 68 65 20 75 70 64 61 74 65 64 20 63 68  e the updated ch
311a0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64  ange counter and
311b0 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67 65   then write page
311c0 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64   1 .        ** d
311d0 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64  irectly to the d
311e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65  atabase file. Be
311f0 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f  cause of the ato
31200 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20  mic-write .     
31210 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f     ** property o
31220 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d  f the host file-
31230 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20  system, this is 
31240 73 61 66 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  safe..        */
31250 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
31260 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
31270 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31  ounter(pPager, 1
31280 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
31290 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
312a0 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
312b0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
312c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
312d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
312e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
312f0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
31300 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b  nter(pPager, 0);
31310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31320 20 7d 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20   }.  #else.     
31330 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
31340 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
31350 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 23 65 6e  Pager, 0);.  #en
31360 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
31370 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
31380 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
31390 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20  one_exit;.  .   
313a0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72     /* If this tr
313b0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61  ansaction has ma
313c0 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
313d0 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c  smaller, then al
313e0 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  l pages.      **
313f0 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
31400 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
31410 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
31420 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
31430 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e  l.      ** file.
31440 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
31450 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61  appen in auto-va
31460 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 20  cuum mode..     
31470 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 66   **.      ** Bef
31480 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  ore reading the 
31490 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20  pages with page 
314a0 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74  numbers larger t
314b0 68 61 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  han the .      *
314c0 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * current value 
314d0 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
314e0 20 73 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b   set dbSize back
314f0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20   to the value.  
31500 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74      ** that it t
31510 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61 72 74  ook at the start
31520 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
31530 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
31540 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  the.      ** cal
31550 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
31560 65 72 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a  erGet() return z
31570 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74  eroed pages inst
31580 65 61 64 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a  ead of .      **
31590 20 72 65 61 64 69 6e 67 20 64 61 74 61 20 66 72   reading data fr
315a0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
315b0 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
315c0 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 6a 6f 75       ** When jou
315d0 72 6e 61 6c 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74  rnal_mode==OFF t
315e0 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73  he dbOrigSize is
315f0 20 61 6c 77 61 79 73 20 7a 65 72 6f 2c 20 73 6f   always zero, so
31600 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 62   this.      ** b
31610 6c 6f 63 6b 20 6e 65 76 65 72 20 72 75 6e 73 20  lock never runs 
31620 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
31630 4f 46 46 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  OFF..      */.  
31640 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31650 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31660 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
31670 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  >dbSize<pPager->
31680 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20  dbOrigSize .    
31690 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 50 61     && ALWAYS(pPa
316a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
316b0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
316c0 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20 20 20 29  ODE_OFF).      )
316d0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  {.        Pgno i
316e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
316f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31700 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
31710 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
31720 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69      const Pgno i
31730 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f  Skip = PAGER_MJ_
31740 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a  PGNO(pPager); /*
31750 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61   Pending lock pa
31760 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  ge */.        co
31770 6e 73 74 20 50 67 6e 6f 20 64 62 53 69 7a 65 20  nst Pgno dbSize 
31780 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
31790 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
317a0 61 73 65 20 69 6d 61 67 65 20 73 69 7a 65 20 2a  ase image size *
317b0 2f 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  / .        pPage
317c0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
317d0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
317e0 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64          for( i=d
317f0 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67  bSize+1; i<=pPag
31800 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20  er->dbOrigSize; 
31810 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i++ ){.         
31820 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 69 74   if( !sqlite3Bit
31830 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
31840 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26  pInJournal, i) &
31850 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20  & i!=iSkip ){.  
31860 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20            PgHdr 
31870 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
31880 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a      /* Page to j
31890 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20  ournal */.      
318a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
318b0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
318c0 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20  r, i, &pPage);. 
318d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
318e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
318f0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
31900 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
31910 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31920 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
31930 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
31940 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
31950 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
31960 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
31970 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
31980 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
31990 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  e_exit;.        
319a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
319b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
319c0 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20  Size = dbSize;. 
319d0 20 20 20 20 20 7d 20 0a 20 20 23 65 6e 64 69 66       } .  #endif
319e0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  .  .      /* Wri
319f0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
31a00 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
31a10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31a20 2e 20 49 66 20 61 20 6d 61 73 74 65 72 20 0a 20  . If a master . 
31a30 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
31a40 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
31a50 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
31a60 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
31a70 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 20 20 2a  l file, .      *
31a80 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20  * or if zMaster 
31a90 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74  is NULL (no mast
31aa0 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65  er journal), the
31ab0 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  n this call is a
31ac0 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a 2f   no-op..      */
31ad0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
31ae0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  eMasterJournal(p
31af0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
31b00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
31b10 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
31b20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
31b30 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20  _exit;.  .      
31b40 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
31b50 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
31b60 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
31b70 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62  ptimization is b
31b80 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 75 73  eing.      ** us
31b90 65 64 2c 20 74 68 69 73 20 63 61 6c 6c 20 77 69  ed, this call wi
31ba0 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65 20 74 68  ll not create th
31bb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
31bc0 72 20 70 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20  r perform any.  
31bd0 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a      ** real IO..
31be0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
31bf0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
31c00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
31c10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31c20 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
31c30 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
31c40 20 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65   .      /* Write
31c50 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
31c60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
31c70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
31c80 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
31c90 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
31ca0 2c 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69  ,sqlite3PcacheDi
31cb0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
31cc0 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20 20  pPCache));.     
31cd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31ce0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
31cf0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
31d00 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
31d10 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63  ;.        goto c
31d20 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
31d30 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
31d40 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
31d50 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
31d60 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 0a 20  ->pPCache);.  . 
31d70 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66       /* If the f
31d80 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e  ile on disk is n
31d90 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  ot the same size
31da0 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
31db0 20 69 6d 61 67 65 2c 0a 20 20 20 20 20 20 2a 2a   image,.      **
31dc0 20 74 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f   then use pager_
31dd0 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77  truncate to grow
31de0 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66   or shrink the f
31df0 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
31e00 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
31e10 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61  ger->dbSize!=pPa
31e20 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
31e30 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
31e40 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64  nNew = pPager->d
31e50 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d  bSize - (pPager-
31e60 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d  >dbSize==PAGER_M
31e70 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
31e80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31e90 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
31ea0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
31eb0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31ec0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
31ed0 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20  Pager, nNew);.  
31ee0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31ef0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
31f00 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
31f10 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
31f20 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c  .      /* Finall
31f30 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  y, sync the data
31f40 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
31f50 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
31f60 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79  >noSync && !noSy
31f70 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  nc ){.        rc
31f80 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
31f90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
31fa0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
31fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31fc0 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
31fd0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
31fe0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
31ff0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
32000 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63  R_SYNCED;.  }..c
32010 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
32020 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
32030 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  c;.}.../*.** Whe
32040 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
32050 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64  is called, the d
32060 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
32070 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79   been completely
32080 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72  .** updated to r
32090 65 66 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67  eflect the chang
320a0 65 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 63  es made by the c
320b0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
320c0 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64  on and.** synced
320d0 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f   to disk. The jo
320e0 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c  urnal file still
320f0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
32100 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74  ile-system .** t
32110 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20  hough, and if a 
32120 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61  failure occurs a
32130 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
32140 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a  will eventually.
32150 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20 61 20  ** be used as a 
32160 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
32170 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
32180 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62  saction rolled b
32190 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
321a0 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a  function finaliz
321b0 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  es the journal f
321c0 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79 20 64  ile, either by d
321d0 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75  eleting, .** tru
321e0 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69  ncating or parti
321f0 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c  ally zeroing it,
32200 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e   so that it cann
32210 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ot be used .** f
32220 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  or hot-journal r
32230 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68  ollback. Once th
32240 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74  is is done the t
32250 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a  ransaction is.**
32260 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d   irrevocably com
32270 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
32280 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
32290 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
322a0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
322b0 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  nd the pager.** 
322c0 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65  moves into the e
322d0 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65  rror state. Othe
322e0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
322f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
32300 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
32310 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
32320 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32330 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
32340 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
32350 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
32360 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
32370 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
32380 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ld not be called
32390 20 69 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f   if a prior erro
323a0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
323b0 20 20 2a 2a 20 42 75 74 20 69 66 20 28 64 75 65    ** But if (due
323c0 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
323d0 6f 72 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20  or elsewhere in 
323e0 74 68 65 20 73 79 73 74 65 6d 29 20 69 74 20 64  the system) it d
323f0 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c  oes get.  ** cal
32400 6c 65 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  led, just return
32410 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20   the same error 
32420 63 6f 64 65 20 77 69 74 68 6f 75 74 20 64 6f 69  code without doi
32430 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a  ng anything. */.
32440 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
32450 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
32460 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
32470 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 68 69  rCode;..  /* Thi
32480 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
32490 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
324a0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
324b0 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61 73 74 0a  not in at least.
324c0 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52    ** PAGER_RESER
324d0 56 45 44 20 73 74 61 74 65 2e 20 2a 2a 46 49 58  VED state. **FIX
324e0 4d 45 2a 2a 3a 20 4d 61 6b 65 20 69 74 20 73 6f  ME**: Make it so
324f0 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20   that this test 
32500 61 6c 77 61 79 73 0a 20 20 2a 2a 20 66 61 69 6c  always.  ** fail
32510 73 20 2d 20 6d 61 6b 65 20 69 74 20 73 6f 20 74  s - make it so t
32520 68 61 74 20 77 65 20 6e 65 76 65 72 20 72 65 61  hat we never rea
32530 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 66  ch this point if
32540 20 77 65 20 64 6f 20 6e 6f 74 20 68 6f 6c 64 0a   we do not hold.
32550 20 20 2a 2a 20 61 6c 6c 20 6e 65 63 65 73 73 61    ** all necessa
32560 72 79 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2f 0a 20  ry locks..  */. 
32570 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
32580 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
32590 45 53 45 52 56 45 44 29 20 29 20 72 65 74 75 72  ESERVED) ) retur
325a0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
325b0 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a  .  /* An optimiz
325c0 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61  ation. If the da
325d0 74 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61  tabase was not a
325e0 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64  ctually modified
325f0 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69   during.  ** thi
32600 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  s transaction, t
32610 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
32620 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
32630 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a  -mode and is.  *
32640 2a 20 75 73 69 6e 67 20 70 65 72 73 69 73 74 65  * using persiste
32650 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  nt journals, the
32660 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
32670 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a  is a no-op..  **
32680 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20  .  ** The start 
32690 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
326a0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
326b0 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20  ntains a single 
326c0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65  journal .  ** he
326d0 61 64 65 72 20 77 69 74 68 20 74 68 65 20 6e 52  ader with the nR
326e0 65 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20  ec field set to 
326f0 30 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75  0. If such a jou
32700 72 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a  rnal is used as.
32710 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
32720 61 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  al during hot-jo
32730 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
32740 30 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62  0 changes will b
32750 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74  e made.  ** to t
32760 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32770 2e 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  . So there is no
32780 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68   need to zero th
32790 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
327a0 68 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68  header. Since th
327b0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
327c0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
327d0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
327e0 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20   ** to drop any 
327f0 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20  locks either..  
32800 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
32810 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
32820 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  & pPager->exclus
32830 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70  iveMode .   && p
32840 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
32850 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
32860 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
32870 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
32880 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
32890 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
328a0 5a 28 70 50 61 67 65 72 29 20 7c 7c 20 21 70 50  Z(pPager) || !pP
328b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
328c0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
328d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
328e0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f   PAGERTRACE(("CO
328f0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
32900 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
32910 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32920 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
32930 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  NCED || MEMDB ||
32940 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
32950 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70  fied );.  rc = p
32960 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
32970 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
32980 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
32990 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
329a0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
329b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
329c0 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
329d0 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
329e0 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
329f0 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
32a00 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
32a10 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f  ion performs two
32a20 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   tasks:.**.**   
32a30 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b  1) It rolls back
32a40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32a50 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c  e, restoring all
32a60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
32a70 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d  nd .**      in-m
32a80 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
32a90 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  s to the state t
32aa0 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e  hey were in when
32ab0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
32ac0 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65  .**      was ope
32ad0 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29  ned, and.**   2)
32ae0 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68   It finalizes th
32af0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
32b00 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  so that it is no
32b10 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a  t used for hot.*
32b20 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20  *      rollback 
32b30 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20  at any point in 
32b40 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a  the future..**.*
32b50 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  * subject to the
32b60 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69   following quali
32b70 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  fications:.**.**
32b80 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
32b90 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65  l file is not ye
32ba0 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  t open when this
32bb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
32bc0 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f  led,.**   then o
32bd0 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f  nly (2) is perfo
32be0 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rmed. In this ca
32bf0 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a  se there is no j
32c00 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
32c10 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a   to roll back..*
32c20 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20  *.** * If in an 
32c30 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
32c40 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
32c50 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31  LL, then task (1
32c60 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f  ) is .**   perfo
32c70 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73  rmed. If success
32c80 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52  ful, task (2). R
32c90 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
32ca0 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66   outcome.**   of
32cb0 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72   either, the err
32cc0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
32cd0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
32ce0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a  to the caller.**
32cf0 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20     (i.e. either 
32d00 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
32d10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
32d20 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20  .**.** * If the 
32d30 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
32d40 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
32d50 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28  , then attempt (
32d60 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20  1). Whether.**  
32d70 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73   or not (1) is s
32d80 75 63 63 65 73 73 66 75 6c 2c 20 61 6c 73 6f 20  uccessful, also 
32d90 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20  attempt (2). If 
32da0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
32db0 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f  rn.**   SQLITE_O
32dc0 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e  K. Otherwise, en
32dd0 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
32de0 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
32df0 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65  he first .**   e
32e00 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e  rror code encoun
32e10 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  tered. .**.**   
32e20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
32e30 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
32e40 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
32e50 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  e was written to
32e60 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61  . .**   So is sa
32e70 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  fe to finalize t
32e80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
32e90 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79  even if the play
32ea0 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72  back .**   (oper
32eb0 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e  ation 1) failed.
32ec0 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67   However the pag
32ed0 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68  er must enter th
32ee0 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a  e error state.**
32ef0 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e     as the conten
32f00 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  ts of the in-mem
32f10 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f  ory cache are no
32f20 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a  w suspect..**.**
32f30 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69   * Finally, if i
32f40 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  n PAGER_EXCLUSIV
32f50 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  E state, then at
32f60 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a  tempt (1). Only.
32f70 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29  **   attempt (2)
32f80 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65   if (1) is succe
32f90 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51  ssful. Return SQ
32fa0 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
32fb0 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65  ssful,.**   othe
32fc0 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20  rwise enter the 
32fd0 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
32fe0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
32ff0 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a   code from the .
33000 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65  **   failing ope
33010 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ration..**.**   
33020 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
33030 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
33040 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  ay have been wri
33050 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74  tten to. So if t
33060 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b  he.**   playback
33070 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   operation did n
33080 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f  ot succeed it wo
33090 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20  uld not be safe 
330a0 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20  to finalize.**  
330b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
330c0 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62  e. It needs to b
330d0 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
330e0 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61  le-system so tha
330f0 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65  t.**   some othe
33100 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73  r process can us
33110 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20  e it to restore 
33120 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61  the database sta
33130 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d  te (by.**   hot-
33140 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
33150 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
33160 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
33170 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
33180 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33190 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
331a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
331b0 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54  code */.  PAGERT
331c0 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE(("ROLLBACK 
331d0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
331e0 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20  Pager)));.  if( 
331f0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
33200 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  er) ){.    int r
33210 63 32 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  c2;..    rc = sq
33220 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
33230 69 6e 74 28 70 50 61 67 65 72 2c 20 53 41 56 45  int(pPager, SAVE
33240 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
33250 2d 31 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70  -1);.    rc2 = p
33260 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
33270 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
33280 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
33290 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
332a0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
332b0 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
332c0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
332d0 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  rc);.  }else if(
332e0 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
332f0 66 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28  fied || !isOpen(
33300 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
33310 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
33320 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
33330 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
33340 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c  etMaster);.  }el
33350 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
33360 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
33370 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
33380 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  E_FULL ){.    if
33390 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
333a0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
333b0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
333c0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
333d0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
333e0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
333f0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
33400 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
33410 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
33420 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  VED ){.      int
33430 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d   rc2;.      rc =
33440 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
33450 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
33460 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e    rc2 = pager_en
33470 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
33480 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
33490 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  tMaster);.      
334a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
334b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
334c0 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
334d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
334e0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
334f0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
33500 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
33510 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
33520 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
33530 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  id = 0;.    }.. 
33540 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
33550 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
33560 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63  a ROLLBACK, we c
33570 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75  an no longer tru
33580 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  st the pager.   
33590 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
335a0 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
335b0 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
335c0 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
335d0 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73  r .    ** persis
335e0 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tent..    */.   
335f0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
33600 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
33610 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
33620 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33630 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
33640 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
33650 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
33660 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
33670 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
33680 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
33690 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73  ritable..*/.u8 s
336a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
336b0 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
336c0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
336d0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
336e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
336f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
33700 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
33710 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
33720 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
33730 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
33740 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
33750 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
33760 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
33770 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  he);.}../*.** Re
33780 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 78 69  turn the approxi
33790 6d 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62  mate number of b
337a0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 63  ytes of memory c
337b0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  urrently.** used
337c0 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61 6e   by the pager an
337d0 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64  d its associated
337e0 20 63 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73   cache..*/.int s
337f0 71 6c 69 74 65 33 50 61 67 65 72 4d 65 6d 55 73  qlite3PagerMemUs
33800 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
33810 29 7b 0a 20 20 69 6e 74 20 70 65 72 50 61 67 65  ){.  int perPage
33820 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
33830 61 67 65 53 69 7a 65 20 2b 20 70 50 61 67 65 72  ageSize + pPager
33840 2d 3e 6e 45 78 74 72 61 20 2b 20 32 30 3b 0a 20  ->nExtra + 20;. 
33850 20 72 65 74 75 72 6e 20 70 65 72 50 61 67 65 53   return perPageS
33860 69 7a 65 2a 73 71 6c 69 74 65 33 50 63 61 63 68  ize*sqlite3Pcach
33870 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
33880 72 2d 3e 70 50 43 61 63 68 65 29 0a 20 20 20 20  r->pPCache).    
33890 20 20 20 20 20 20 20 2b 20 73 71 6c 69 74 65 33         + sqlite3
338a0 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 50 61 67 65  MallocSize(pPage
338b0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  r);.}../*.** Ret
338c0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
338d0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
338e0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
338f0 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
33900 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
33910 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67  unt(DbPage *pPag
33920 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
33930 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
33940 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d  fcount(pPage);.}
33950 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
33960 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
33970 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
33980 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
33990 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
339a0 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
339b0 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
339c0 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
339d0 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
339e0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [0] = sqlite3Pca
339f0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
33a00 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
33a10 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[1] = sqlite3Pc
33a20 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
33a30 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
33a40 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33    a[2] = sqlite3
33a50 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69  PcacheGetCachesi
33a60 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
33a70 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  he);.  a[3] = pP
33a80 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
33a90 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72  d ? (int) pPager
33aa0 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20  ->dbSize : -1;. 
33ab0 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
33ac0 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
33ad0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
33ae0 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
33af0 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
33b00 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
33b10 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
33b20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
33b30 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
33b40 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
33b50 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
33b60 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
33b70 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64  return a;.}.#end
33b80 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
33b90 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
33ba0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
33bb0 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
33bc0 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28  te3PagerIsMemdb(
33bd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
33be0 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a    return MEMDB;.
33bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
33c00 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74  hat there are at
33c10 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e   least nSavepoin
33c20 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65  t savepoints ope
33c30 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  n. If there are.
33c40 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73  ** currently les
33c50 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e  s than nSavepoin
33c60 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70  ts open, then op
33c70 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  en one or more s
33c80 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  avepoints.** to 
33c90 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66  make up the diff
33ca0 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e  erence. If the n
33cb0 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
33cc0 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  nts is already.*
33cd0 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65  * equal to nSave
33ce0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
33cf0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
33d00 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  o-op..**.** If a
33d10 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
33d20 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  on fails, SQLITE
33d30 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
33d40 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
33d50 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
33d60 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62   opening the sub
33d70 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74  -journal file, t
33d80 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hen an IO error 
33d90 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
33da0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
33db0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
33dc0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
33dd0 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  enSavepoint(Page
33de0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
33df0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
33e00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33e20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
33e30 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
33e40 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65  nCurrent = pPage
33e50 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  r->nSavepoint;  
33e60 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
33e70 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
33e80 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20  oints */..  if( 
33e90 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72  nSavepoint>nCurr
33ea0 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75  ent && pPager->u
33eb0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
33ec0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
33ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
33ef0 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
33f00 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
33f10 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20  int *aNew;      
33f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33f30 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70  New Pager.aSavep
33f40 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  oint array */.  
33f50 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
33f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
33f80 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  e of database fi
33f90 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
33fa0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
33fb0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
33fc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
33fd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
33fe0 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
33ff0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
34000 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65 61   array using rea
34010 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53  lloc(). Return S
34020 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20  QLITE_NOMEM.    
34030 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61  ** if the alloca
34040 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65  tion fails. Othe
34050 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20  rwise, zero the 
34060 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63  new portion in c
34070 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61  ase a .    ** ma
34080 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
34090 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61  urs while popula
340a0 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66  ting it in the f
340b0 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c  or(...) loop bel
340c0 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ow..    */.    a
340d0 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76 65  New = (PagerSave
340e0 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52  point *)sqlite3R
340f0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
34100 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
34110 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72  nt, sizeof(Pager
34120 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65  Savepoint)*nSave
34130 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20  point.    );.   
34140 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20   if( !aNew ){.  
34150 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34160 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
34170 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b     memset(&aNew[
34180 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e  nCurrent], 0, (n
34190 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65  Savepoint-nCurre
341a0 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67  nt) * sizeof(Pag
341b0 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20  erSavepoint));. 
341c0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
341d0 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 0a 20  point = aNew;.. 
341e0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
341f0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
34200 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73  t structures jus
34210 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a  t allocated. */.
34220 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72      for(ii=nCurr
34230 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69  ent; ii<nSavepoi
34240 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
34250 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20   aNew[ii].nOrig 
34260 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 69  = nPage;.      i
34270 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
34280 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
34290 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29  ->journalOff>0 )
342a0 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
342b0 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61  i].iOffset = pPa
342c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
342d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
342e0 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
342f0 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c  Offset = JOURNAL
34300 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
34310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
34320 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20  New[ii].iSubRec 
34330 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  = pPager->nSubRe
34340 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69  c;.      aNew[ii
34350 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ].pInSavepoint =
34360 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
34370 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 20  eate(nPage);.   
34380 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d     if( !aNew[ii]
34390 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  .pInSavepoint ){
343a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
343b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
343c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
343d0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
343e0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  er) ){.        s
343f0 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
34400 6e 74 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  nt(pPager->pWal,
34410 20 61 4e 65 77 5b 69 69 5d 2e 61 57 61 6c 44 61   aNew[ii].aWalDa
34420 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
34430 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
34440 70 6f 69 6e 74 20 3d 20 69 69 2b 31 3b 0a 20 20  point = ii+1;.  
34450 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
34460 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
34470 6e 74 3d 3d 6e 53 61 76 65 70 6f 69 6e 74 20 29  nt==nSavepoint )
34480 3b 0a 20 20 20 20 61 73 73 65 72 74 54 72 75 6e  ;.    assertTrun
34490 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
344a0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
344b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
344c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
344d0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
344e0 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73  llback or releas
344f0 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76  e (commit) a sav
34500 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73  epoint..** The s
34510 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65  avepoint to rele
34520 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
34530 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20  need not be the 
34540 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a  most recently .*
34550 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  * created savepo
34560 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  int..**.** Param
34570 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79  eter op is alway
34580 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  s either SAVEPOI
34590 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53  NT_ROLLBACK or S
345a0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
345b0 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41  ..** If it is SA
345c0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
345d0 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e   then release an
345e0 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  d destroy the sa
345f0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20  vepoint with.** 
34600 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74  index iSavepoint
34610 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
34620 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
34630 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c  hen rollback all
34640 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74   changes.** that
34650 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73   have occurred s
34660 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69  ince the specifi
34670 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73  ed savepoint was
34680 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
34690 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
346a0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c   rollback or rel
346b0 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69  ease is identifi
346c0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
346d0 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  .** iSavepoint. 
346e0 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61  A value of 0 mea
346f0 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ns to operate on
34700 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
34710 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65  avepoint.** (the
34720 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e   first created).
34730 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67   A value of (Pag
34740 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
34750 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a   means operate.*
34760 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  * on the most re
34770 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73  cently created s
34780 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61  avepoint. If iSa
34790 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
347a0 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65  er than.** (Page
347b0 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c  r.nSavepoint-1),
347c0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
347d0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
347e0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74  **.** If a negat
347f0 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73  ive value is pas
34800 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
34810 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  tion, then the c
34820 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
34830 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
34840 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
34850 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69  fferent to calli
34860 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
34870 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  gerRollback() be
34880 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
34890 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72  ion does not ter
348a0 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72  minate.** the tr
348b0 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c  ansaction or unl
348c0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
348d0 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72  , it just restor
348e0 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  es the .** conte
348f0 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
34900 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
34910 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  nal state. .**.*
34920 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61  * In any case, a
34930 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ll savepoints wi
34940 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  th an index grea
34950 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f  ter than iSavepo
34960 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74  int .** are dest
34970 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69  royed. If this i
34980 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72  s a release oper
34990 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50  ation (op==SAVEP
349a0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a  OINT_RELEASE),.*
349b0 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74  * then savepoint
349c0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61   iSavepoint is a
349d0 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  lso destroyed..*
349e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
349f0 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
34a00 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
34a10 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
34a20 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61  n fails,.** or a
34a30 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
34a40 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
34a50 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c  ccurs while roll
34a60 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73  ing back a .** s
34a70 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20  avepoint. If no 
34a80 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51  errors occur, SQ
34a90 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
34aa0 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ned..*/ .int sql
34ab0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
34ac0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
34ad0 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
34ae0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
34af0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34b00 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
34b10 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
34b20 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
34b30 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
34b40 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
34b50 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41  int>=0 || op==SA
34b60 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
34b70 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65   );..  if( iSave
34b80 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53  point<pPager->nS
34b90 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
34ba0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
34bb0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
34bc0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  ariable */.    i
34bd0 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
34be0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
34bf0 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69  emaining savepoi
34c00 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f  nts after this o
34c10 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p. */..    /* Fi
34c20 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
34c30 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c  y savepoints wil
34c40 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76  l still be activ
34c50 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20  e after this.   
34c60 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
34c70 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20  tore this value 
34c80 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72  in nNew. Then fr
34c90 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73  ee resources ass
34ca0 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20  ociated .    ** 
34cb0 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69  with any savepoi
34cc0 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73  nts that are des
34cd0 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f  troyed by this o
34ce0 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
34cf0 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76  .    nNew = iSav
34d00 65 70 6f 69 6e 74 20 2b 20 28 28 20 6f 70 3d 3d  epoint + (( op==
34d10 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
34d20 45 20 29 20 3f 20 30 20 3a 20 31 29 3b 0a 20 20  E ) ? 0 : 1);.  
34d30 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69    for(ii=nNew; i
34d40 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
34d50 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
34d60 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
34d70 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
34d80 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
34d90 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
34da0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
34db0 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65  nSavepoint = nNe
34dc0 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  w;..    /* If th
34dd0 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20  is is a release 
34de0 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74  of the outermost
34df0 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e   savepoint, trun
34e00 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65  cate .    ** the
34e10 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   sub-journal to 
34e20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
34e30 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ze. */.    if( o
34e40 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
34e50 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 69 66  EASE ){.      if
34e60 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 69 73 4f  ( nNew==0 && isO
34e70 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
34e80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
34e90 4f 6e 6c 79 20 74 72 75 6e 63 61 74 65 20 69 66  Only truncate if
34ea0 20 69 74 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d   it is an in-mem
34eb0 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  ory sub-journal.
34ec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
34ed0 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
34ee0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
34ef0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
34f00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
34f10 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  ncate(pPager->sj
34f20 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
34f30 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
34f40 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
34f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
34f60 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
34f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34f80 20 20 20 20 2f 2a 20 45 6c 73 65 20 74 68 69 73      /* Else this
34f90 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
34fa0 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61  peration, playba
34fb0 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ck the specified
34fc0 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20   savepoint..    
34fd0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
34fe0 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73  temp-file, it is
34ff0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74   possible that t
35000 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35010 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79  has.    ** not y
35020 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20  et been opened. 
35030 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
35040 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
35050 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a  changes to.    *
35060 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
35070 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 79  ile, so the play
35080 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63  back operation c
35090 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
350a0 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69     */.    else i
350b0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
350c0 50 61 67 65 72 29 20 7c 7c 20 69 73 4f 70 65 6e  Pager) || isOpen
350d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
350e0 0a 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65  .      PagerSave
350f0 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
35100 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a  t = (nNew==0)?0:
35110 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
35120 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20  int[nNew-1];.   
35130 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61     rc = pagerPla
35140 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70  ybackSavepoint(p
35150 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e  Pager, pSavepoin
35160 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
35170 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc!=SQLITE_DONE
35180 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 7d 0a  );.    }.  .  }.
35190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
351a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
351b0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
351c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
351d0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
351e0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
351f0 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
35200 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
35210 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
35220 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
35230 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72  turn the VFS str
35240 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70  ucture for the p
35250 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  ager..*/.const s
35260 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69  qlite3_vfs *sqli
35270 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65  te3PagerVfs(Page
35280 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
35290 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66  turn pPager->pVf
352a0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
352b0 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  rn the file hand
352c0 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  le for the datab
352d0 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
352e0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
352f0 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67  pager.  This mig
35300 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ht return NULL i
35310 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a  f the file has.*
35320 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
35330 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  pened..*/.sqlite
35340 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50  3_file *sqlite3P
35350 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a  agerFile(Pager *
35360 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
35370 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a  n pPager->fd;.}.
35380 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
35390 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
353a0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
353b0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
353c0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
353d0 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  Journalname(Page
353e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
353f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
35400 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
35410 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
35420 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
35430 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
35440 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
35450 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
35460 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
35470 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
35480 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
35490 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  rNosync(Pager *p
354a0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
354b0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
354c0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
354d0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
354e0 2a 20 53 65 74 20 6f 72 20 72 65 74 72 69 65 76  * Set or retriev
354f0 65 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  e the codec for 
35500 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
35510 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
35520 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72  etCodec(.  Pager
35530 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
35540 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
35550 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
35560 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  ),.  void (*xCod
35570 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
35580 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f  *,int,int),.  vo
35590 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
355a0 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20  (void*),.  void 
355b0 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28  *pCodec.){.  if(
355c0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
355d0 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
355e0 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
355f0 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67  >pCodec);.  pPag
35600 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50 61  er->xCodec = pPa
35610 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20 3a  ger->memDb ? 0 :
35620 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
35630 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
35640 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68  g = xCodecSizeCh
35650 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  ng;.  pPager->xC
35660 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65  odecFree = xCode
35670 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d  cFree;.  pPager-
35680 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63  >pCodec = pCodec
35690 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74 53  ;.  pagerReportS
356a0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76  ize(pPager);.}.v
356b0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
356c0 72 47 65 74 43 6f 64 65 63 28 50 61 67 65 72 20  rGetCodec(Pager 
356d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
356e0 72 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  rn pPager->pCode
356f0 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c;.}.#endif..#if
35700 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35710 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
35720 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
35730 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  pPg to location 
35740 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
35750 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
35760 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
35770 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
35780 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
35790 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77  ed at.** pgno (w
357a0 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67  hich we call pPg
357b0 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74  Old) though that
357c0 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64   page is allowed
357d0 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63   to be.** in cac
357e0 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  he.  If the page
357f0 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
35800 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
35810 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
35820 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
35830 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
35840 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
35850 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
35860 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
35870 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
35880 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
35890 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
358a0 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
358b0 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
358c0 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
358d0 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
358e0 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
358f0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
35900 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
35910 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
35920 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
35930 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
35940 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
35950 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
35960 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
35970 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
35980 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
35990 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
359a0 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
359b0 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
359c0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
359d0 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
359e0 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
359f0 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
35a00 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
35a10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
35a20 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ctive)..**.** If
35a30 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
35a40 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  ment, isCommit, 
35a50 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
35a60 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62  n this page is b
35a70 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73  eing.** moved as
35a80 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62   part of a datab
35a90 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69  ase reorganizati
35aa0 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  on just before t
35ab0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
35ac0 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  ** is being comm
35ad0 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  itted. In this c
35ae0 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61  ase, it is guara
35af0 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64  nteed that the d
35b00 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a  atabase page .**
35b10 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77   pPg refers to w
35b20 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
35b30 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68  en to again with
35b40 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
35b50 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
35b60 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
35b70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
35b80 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
35b90 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
35ba0 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65  .** occurs. Othe
35bb0 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e  rwise, it return
35bc0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
35bd0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
35be0 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
35bf0 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
35c00 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pPg, Pgno pgno, 
35c10 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20  int isCommit){. 
35c20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
35c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35c40 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   The page being 
35c50 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a  overwritten. */.
35c60 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
35c70 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  gno = 0;       /
35c80 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70  * Old value of p
35c90 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e  Pg->pgno, if syn
35ca0 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f  c is required */
35cb0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
35cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cd0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
35ce0 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e  /.  Pgno origPgn
35cf0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
35d00 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   /* The original
35d10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
35d20 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
35d30 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  nRef>0 );..  /* 
35d40 49 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61  In order to be a
35d50 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
35d60 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
35d70 74 61 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72  tabase must jour
35d80 6e 61 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  nal.  ** the pag
35d90 65 20 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 20  e we are moving 
35da0 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  from..  */.  if(
35db0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63   MEMDB ){.    rc
35dc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35dd0 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69  rite(pPg);.    i
35de0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
35df0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
35e00 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d  the page being m
35e10 6f 76 65 64 20 69 73 20 64 69 72 74 79 20 61 6e  oved is dirty an
35e20 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73  d has not been s
35e30 61 76 65 64 20 62 79 20 74 68 65 20 6c 61 74 65  aved by the late
35e40 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e  st.  ** savepoin
35e50 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74 68 65  t, then save the
35e60 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
35e70 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
35e80 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62  to the .  ** sub
35e90 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68  -journal now. Th
35ea0 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 74  is is required t
35eb0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c  o handle the fol
35ec0 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a  lowing scenario:
35ed0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47  .  **.  **   BEG
35ee0 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  IN;.  **     <jo
35ef0 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68  urnal page X, th
35f00 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20  en modify it in 
35f10 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20  memory>.  **    
35f20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
35f30 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65    **       <Move
35f40 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74   page X to locat
35f50 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20  ion Y>.  **     
35f60 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b  ROLLBACK TO one;
35f70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61  .  **.  ** If pa
35f80 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72  ge X were not wr
35f90 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
35fa0 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69  -journal here, i
35fb0 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a  t would not.  **
35fc0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
35fd0 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74  restore its cont
35fe0 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20 22 52  ents when the "R
35ff0 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a  OLLBACK TO one".
36000 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
36010 65 72 65 20 69 73 20 70 72 6f 63 65 73 73 65 64  ere is processed
36020 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a  ..  **.  ** subj
36030 6f 75 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79  ournalPage() may
36040 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   need to allocat
36050 65 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65  e space to store
36060 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a   pPg->pgno into.
36070 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    ** one or more
36080 20 73 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65   savepoint bitve
36090 63 73 2e 20 54 68 69 73 20 69 73 20 74 68 65 20  cs. This is the 
360a0 72 65 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63  reason this func
360b0 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65  tion.  ** may re
360c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
360d0 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  M..  */.  if( pP
360e0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
360f0 49 52 54 59 0a 20 20 20 26 26 20 73 75 62 6a 52  IRTY.   && subjR
36100 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
36110 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  .   && SQLITE_OK
36120 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e  !=(rc = subjourn
36130 61 6c 50 61 67 65 28 70 50 67 29 29 0a 20 20 29  alPage(pPg)).  )
36140 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
36150 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
36160 43 45 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67  CE(("MOVE %d pag
36170 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25  e %d (needSync=%
36180 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e  d) moves to %d\n
36190 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49  ", .      PAGERI
361a0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
361b0 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67  pgno, (pPg->flag
361c0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
361d0 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a  C)?1:0, pgno));.
361e0 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
361f0 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
36200 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
36210 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66   pgno))..  /* If
36220 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
36230 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
36240 64 20 62 65 66 6f 72 65 20 70 61 67 65 20 70 50  d before page pP
36250 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a  g->pgno can.  **
36260 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20   be written to, 
36270 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20  store pPg->pgno 
36280 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
36290 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
362a0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
362b0 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
362c0 73 20 73 65 74 2c 20 74 68 65 72 65 20 69 73 20  s set, there is 
362d0 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
362e0 62 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ber that.  ** th
362f0 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
36300 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
36310 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
36320 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20  age pPg->pgno . 
36330 20 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74   ** can be writt
36340 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
36350 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
36360 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
36370 69 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a  ite to it..  */.
36380 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67    if( (pPg->flag
36390 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
363a0 43 29 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20  C) && !isCommit 
363b0 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
363c0 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
363d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
363e0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
363f0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
36400 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
36410 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
36420 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
36430 44 49 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73  DIRTY );.    ass
36440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
36450 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
36460 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
36470 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
36480 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
36490 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
364a0 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68  .  ** from its h
364b0 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c  ash chain. Also,
364c0 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   if the PgHdr.ne
364d0 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66  edSync was set f
364e0 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67  or .  ** page pg
364f0 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d  no before the 'm
36500 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ove' operation, 
36510 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  it needs to be r
36520 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f  etained .  ** fo
36530 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64  r the page moved
36540 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70   there..  */.  p
36550 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
36560 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
36570 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f   pPgOld = pager_
36580 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
36590 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
365a0 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c  !pPgOld || pPgOl
365b0 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20  d->nRef==1 );.  
365c0 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
365d0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
365e0 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50  (pPgOld->flags&P
365f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b  GHDR_NEED_SYNC);
36600 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
36610 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
36620 74 20 64 69 73 63 61 72 64 20 70 61 67 65 73 20  t discard pages 
36630 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  from an in-memor
36640 79 20 64 61 74 61 62 61 73 65 20 73 69 6e 63 65  y database since
36650 20 77 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20   we might.      
36660 2a 2a 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  ** need to rollb
36670 61 63 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73 74  ack later.  Just
36680 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 6f   move the page o
36690 75 74 20 6f 66 20 74 68 65 20 77 61 79 2e 20 2a  ut of the way. *
366a0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
366b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
366c0 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  lid );.      sql
366d0 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70  ite3PcacheMove(p
366e0 50 67 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64  PgOld, pPager->d
366f0 62 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65  bSize+1);.    }e
36700 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
36710 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
36720 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Old);.    }.  }.
36730 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50  .  origPgno = pP
36740 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74  g->pgno;.  sqlit
36750 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
36760 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74  , pgno);.  sqlit
36770 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
36780 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
36790 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
367a0 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
367b0 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
367c0 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
367d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
367e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
367f0 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
36800 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
36810 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
36820 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
36830 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
36840 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
36850 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
36860 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
36870 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
36880 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
36890 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e      ** "is journ
368a0 61 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61  aled" bitvec fla
368b0 67 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  g has been set. 
368c0 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
368d0 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20   remedied by.   
368e0 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   ** loading the 
368f0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
36900 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65  ger-cache and se
36910 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
36920 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
36930 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
36940 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65    ** If the atte
36950 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  mpt to load the 
36960 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
36970 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20  ge-cache fails, 
36980 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61  (due.    ** to a
36990 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
369a0 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20  failure), clear 
369b0 74 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70  the bit in the p
369c0 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20  InJournal[].    
369d0 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  ** array. Otherw
369e0 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65  ise, if the page
369f0 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77   is loaded and w
36a00 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a  ritten again in.
36a10 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e      ** this tran
36a20 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20  saction, it may 
36a30 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
36a40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36a50 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74  before.    ** it
36a60 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20   is synced into 
36a70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36a80 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d  . This way, it m
36a90 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20  ay end up in.   
36aa0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
36ab0 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20  file twice, but 
36ac0 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72  that is not a pr
36ad0 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20  oblem..    **.  
36ae0 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
36af0 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20  PagerGet() call 
36b00 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f  may cause the jo
36b10 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53  urnal to sync. S
36b20 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
36b30 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  re the Pager.nee
36b40 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
36b50 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  t too..    */.  
36b60 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
36b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36b80 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
36b90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
36ba0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
36bb0 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
36bc0 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
36bd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36be0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
36bf0 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65  dSyncPgno<=pPage
36c00 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
36c10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36c20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
36c30 63 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ce!=0 );.       
36c40 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c   sqlite3BitvecCl
36c50 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ear(pPager->pInJ
36c60 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63  ournal, needSync
36c70 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54  Pgno, pPager->pT
36c80 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
36c90 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
36ca0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
36cb0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
36cc0 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
36cd0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30  Pager->noSync==0
36ce0 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
36cf0 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20    pPgHdr->flags 
36d00 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
36d10 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  NC;.    sqlite3P
36d20 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
36d30 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69  PgHdr);.    sqli
36d40 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
36d50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  gHdr);.  }..  /*
36d60 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d  .  ** For an in-
36d70 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
36d80 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   make sure the o
36d90 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
36da0 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65  tinues.  ** to e
36db0 78 69 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68  xist, in case th
36dc0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  e transaction ne
36dd0 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  eds to roll back
36de0 2e 20 20 55 73 65 20 70 50 67 4f 6c 64 0a 20 20  .  Use pPgOld.  
36df0 2a 2a 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e  ** as the origin
36e00 61 6c 20 70 61 67 65 20 73 69 6e 63 65 20 69 74  al page since it
36e10 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
36e20 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a  n allocated..  *
36e30 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
36e40 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
36e50 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f  heMove(pPgOld, o
36e60 72 69 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71  rigPgno);.    sq
36e70 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
36e80 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  pPgOld);.  }..  
36e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36ea0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
36eb0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
36ec0 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66  er to the data f
36ed0 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
36ee0 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
36ef0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
36f00 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  ata(DbPage *pPg)
36f10 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
36f20 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e  >nRef>0 || pPg->
36f30 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b  pPager->memDb );
36f40 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
36f50 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Data;.}../*.** R
36f60 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
36f70 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
36f80 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
36f90 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
36fa0 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
36fb0 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
36fc0 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
36fd0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
36fe0 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
36ff0 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
37000 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a  ->pExtra;.}../*.
37010 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c  ** Get/set the l
37020 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20  ocking-mode for 
37030 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
37040 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
37050 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
37060 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
37070 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43  QUERY, PAGER_LOC
37080 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
37090 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43  or .** PAGER_LOC
370a0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
370b0 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  VE. If the param
370c0 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
370d0 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
370e0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20  locking-mode is 
370f0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
37100 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
37110 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
37120 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
37130 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
37140 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41  _NORMAL or.** PA
37150 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
37160 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63  EXCLUSIVE, indic
37170 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ating the curren
37180 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
37190 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d  ted).** locking-
371a0 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
371b0 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
371c0 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
371d0 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
371e0 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
371f0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
37200 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
37210 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
37220 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
37230 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
37240 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
37250 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
37260 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
37270 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
37280 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30  KINGMODE_QUERY<0
37290 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
372a0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
372b0 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47  NORMAL>=0 && PAG
372c0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
372d0 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20  XCLUSIVE>=0 );. 
372e0 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26   if( eMode>=0 &&
372f0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
37300 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
37310 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
37320 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d  = (u8)eMode;.  }
37330 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
37340 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
37350 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Mode;.}../*.** S
37360 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  et the journal-m
37370 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
37380 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
37390 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  ode must be one 
373a0 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47  of:.**.**    PAG
373b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
373c0 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  ELETE.**    PAGE
373d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
373e0 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47  UNCATE.**    PAG
373f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
37400 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47  ERSIST.**    PAG
37410 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
37420 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  FF.**    PAGER_J
37430 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
37440 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  Y.**    PAGER_JO
37450 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 2a 2a  URNALMODE_WAL.**
37460 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 6d  .** The journalm
37470 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
37480 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
37490 64 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20  d if the change 
374a0 69 73 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 54  is allowed..** T
374b0 68 65 20 63 68 61 6e 67 65 20 6d 61 79 20 62 65  he change may be
374c0 20 64 69 73 61 6c 6c 6f 77 65 64 20 66 6f 72 20   disallowed for 
374d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  the following re
374e0 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  asons:.**.**   *
374f0 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    An in-memory d
37500 61 74 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79  atabase can only
37510 20 68 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61   have its journa
37520 6c 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f  l_mode set to _O
37530 46 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d  FF.**      or _M
37540 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  EMORY..**.**   *
37550 20 20 54 65 6d 70 6f 72 61 72 79 20 64 61 74 61    Temporary data
37560 62 61 73 65 73 20 63 61 6e 6e 6f 74 20 68 61 76  bases cannot hav
37570 65 20 5f 57 41 4c 20 6a 6f 75 72 6e 61 6c 6d 6f  e _WAL journalmo
37580 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  de..**.** The re
37590 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20  turned indicate 
375a0 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
375b0 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a  sibly updated) j
375c0 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ournal-mode..*/.
375d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
375e0 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50  SetJournalMode(P
375f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
37600 74 20 65 4d 6f 64 65 29 7b 0a 20 20 75 38 20 65  t eMode){.  u8 e
37610 4f 6c 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Old = pPager->jo
37620 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 2f 2a  urnalMode;    /*
37630 20 50 72 69 6f 72 20 6a 6f 75 72 6e 61 6c 6d 6f   Prior journalmo
37640 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  de */..  /* The 
37650 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20  eMode parameter 
37660 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
37670 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 20 20 20  */.  assert(    
37680 20 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a    eMode==PAGER_J
37690 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
376a0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E.            ||
376b0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
376c0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
376d0 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  TE.            |
376e0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
376f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
37700 53 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ST.            |
37710 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
37720 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
37730 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
37740 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
37750 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
37760 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
37770 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
37780 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a  MODE_MEMORY );..
37790 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
377a0 77 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64  w the journalmod
377b0 65 20 6f 66 20 61 20 54 45 4d 50 20 64 61 74 61  e of a TEMP data
377c0 62 61 73 65 20 74 6f 20 62 65 20 63 68 61 6e 67  base to be chang
377d0 65 64 20 74 6f 20 57 41 4c 0a 20 20 2a 2f 0a 20  ed to WAL.  */. 
377e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
377f0 70 46 69 6c 65 20 26 26 20 65 4d 6f 64 65 3d 3d  pFile && eMode==
37800 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37810 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 61 73 73  E_WAL ){.    ass
37820 65 72 74 28 20 65 4f 6c 64 21 3d 50 41 47 45 52  ert( eOld!=PAGER
37830 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
37840 20 29 3b 0a 20 20 20 20 65 4d 6f 64 65 20 3d 20   );.    eMode = 
37850 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eOld;.  }..  /* 
37860 44 6f 20 61 6c 6c 6f 77 20 74 68 65 20 6a 6f 75  Do allow the jou
37870 72 6e 61 6c 6d 6f 64 65 20 6f 66 20 61 6e 20 69  rnalmode of an i
37880 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
37890 65 20 74 6f 20 62 65 20 73 65 74 20 74 6f 0a 20  e to be set to. 
378a0 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   ** anything oth
378b0 65 72 20 74 68 61 6e 20 4d 45 4d 4f 52 59 20 6f  er than MEMORY o
378c0 72 20 4f 46 46 0a 20 20 2a 2f 0a 20 20 69 66 28  r OFF.  */.  if(
378d0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73   MEMDB ){.    as
378e0 73 65 72 74 28 20 65 4f 6c 64 3d 3d 50 41 47 45  sert( eOld==PAGE
378f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
37900 4d 4f 52 59 20 7c 7c 20 65 4f 6c 64 3d 3d 50 41  MORY || eOld==PA
37910 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37920 4f 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20 65  OFF );.    if( e
37930 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
37940 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26  NALMODE_MEMORY &
37950 26 20 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  & eMode!=PAGER_J
37960 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
37970 7b 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20  {.      eMode = 
37980 65 4f 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  eOld;.    }.  }.
37990 0a 20 20 69 66 28 20 65 4d 6f 64 65 21 3d 65 4f  .  if( eMode!=eO
379a0 6c 64 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65  ld ){.    /* Whe
379b0 6e 20 63 68 61 6e 67 69 6e 67 20 62 65 74 77 65  n changing betwe
379c0 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  en rollback mode
379d0 73 2c 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  s, close the jou
379e0 72 6e 61 6c 20 66 69 6c 65 20 70 72 69 6f 72 0a  rnal file prior.
379f0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 68      ** to the ch
37a00 61 6e 67 65 2e 20 20 42 75 74 20 77 68 65 6e 20  ange.  But when 
37a10 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 61 20  changing from a 
37a20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 6f  rollback mode to
37a30 20 57 41 4c 2c 20 6b 65 65 70 0a 20 20 20 20 2a   WAL, keep.    *
37a40 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 70  * the journal op
37a50 65 6e 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  en since there i
37a60 73 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 73 74 79  s a rollback-sty
37a70 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  le transaction i
37a80 6e 20 70 6c 61 79 0a 20 20 20 20 2a 2a 20 75 73  n play.    ** us
37a90 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68  ed to convert th
37aa0 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
37ab0 73 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 68  s in the btree h
37ac0 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
37ad0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
37ae0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 65 4d 6f  ger->jfd) && eMo
37af0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
37b00 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
37b10 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
37b20 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
37b30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
37b40 61 6e 67 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ange the journal
37b50 20 6d 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 50   mode. */.    pP
37b60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
37b70 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 0a  e = (u8)eMode;..
37b80 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 72 61 6e      /* When tran
37b90 73 69 73 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  sistioning from 
37ba0 54 52 55 4e 43 41 54 45 20 6f 72 20 50 45 52 53  TRUNCATE or PERS
37bb0 49 53 54 20 74 6f 20 61 6e 79 20 6f 74 68 65 72  IST to any other
37bc0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
37bd0 6d 6f 64 65 20 65 78 63 65 70 74 20 57 41 4c 20  mode except WAL 
37be0 28 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20  (and we are not 
37bf0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
37c00 45 58 43 4c 55 53 49 56 45 29 20 74 68 65 6e 20  EXCLUSIVE) then 
37c10 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74  .    ** delete t
37c20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
37c30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
37c40 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
37c50 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
37c60 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
37c70 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
37c80 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
37c90 54 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20  T & 5)==1 );.   
37ca0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
37cb0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
37cc0 54 45 20 26 20 35 29 3d 3d 30 20 29 3b 0a 20 20  TE & 5)==0 );.  
37cd0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
37ce0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
37cf0 4f 52 59 20 26 20 35 29 3d 3d 34 20 29 3b 0a 20  ORY & 5)==4 );. 
37d00 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
37d10 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
37d20 46 20 26 20 35 29 3d 3d 30 20 29 3b 0a 20 20 20  F & 5)==0 );.   
37d30 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
37d40 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
37d50 26 20 35 29 3d 3d 35 20 29 3b 0a 0a 20 20 20 20  & 5)==5 );..    
37d60 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
37d70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
37d80 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
37d90 6f 64 65 20 29 3b 0a 20 20 20 20 69 66 28 20 21  ode );.    if( !
37da0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
37db0 65 4d 6f 64 65 20 26 26 20 28 65 4f 6c 64 20 26  eMode && (eOld &
37dc0 20 35 29 3d 3d 31 20 26 26 20 28 65 4d 6f 64 65   5)==1 && (eMode
37dd0 20 26 20 31 29 3d 3d 30 20 29 7b 0a 0a 20 20 20   & 1)==0 ){..   
37de0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
37df0 73 65 20 77 65 20 77 6f 75 6c 64 20 6c 69 6b 65  se we would like
37e00 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
37e10 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
37e20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e  it is.      ** n
37e30 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  ot possible, the
37e40 6e 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  n that is not a 
37e50 70 72 6f 62 6c 65 6d 2e 20 44 65 6c 65 74 69 6e  problem. Deletin
37e60 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
37e70 6c 65 0a 20 20 20 20 20 20 2a 2a 20 68 65 72 65  le.      ** here
37e80 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
37e90 69 6f 6e 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ion only..      
37ea0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f  **.      ** Befo
37eb0 72 65 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  re deleting the 
37ec0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 62  journal file, ob
37ed0 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
37ee0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
37ef0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
37f00 6c 65 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  le. This ensures
37f10 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
37f20 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l file is not de
37f30 6c 65 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77  leted.      ** w
37f40 68 69 6c 65 20 69 74 20 69 73 20 69 6e 20 75 73  hile it is in us
37f50 65 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20  e by some other 
37f60 63 6c 69 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  client..      */
37f70 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
37f80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
37f90 20 69 6e 74 20 73 74 61 74 65 20 3d 20 70 50 61   int state = pPa
37fa0 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 20 20  ger->state;.    
37fb0 20 20 69 66 28 20 73 74 61 74 65 3c 50 41 47 45    if( state<PAGE
37fc0 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  R_SHARED ){.    
37fd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37fe0 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
37ff0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
38000 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
38010 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
38020 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20  SHARED ){.      
38030 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
38040 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
38050 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
38060 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
38070 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
38080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
38090 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
380a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
380b0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
380c0 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
380d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
380e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
380f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
38100 20 26 26 20 73 74 61 74 65 3d 3d 50 41 47 45 52   && state==PAGER
38110 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20  _SHARED ){.     
38120 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
38130 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
38140 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
38150 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 61     }else if( sta
38160 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
38170 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
38180 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
38190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
381a0 61 73 73 65 72 74 28 20 73 74 61 74 65 3d 3d 70  assert( state==p
381b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 3b 0a  Pager->state );.
381c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
381d0 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6a  Return the new j
381e0 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20  ournal mode */. 
381f0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
38200 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
38210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
38220 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  n the current jo
38230 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal mode..*/.i
38240 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nt sqlite3PagerG
38250 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61  etJournalMode(Pa
38260 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
38270 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
38280 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b  er->journalMode;
38290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
382a0 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
382b0 65 72 20 69 73 20 69 6e 20 61 20 73 74 61 74 65  er is in a state
382c0 20 77 68 65 72 65 20 69 74 20 69 73 20 4f 4b 20   where it is OK 
382d0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 0a 2a 2a  to change the.**
382e0 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 2e 20 20 4a   journalmode.  J
382f0 6f 75 72 6e 61 6c 6d 6f 64 65 20 63 68 61 6e 67  ournalmode chang
38300 65 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  es can only happ
38310 65 6e 20 77 68 65 6e 20 74 68 65 20 64 61 74 61  en when the data
38320 62 61 73 65 0a 2a 2a 20 69 73 20 75 6e 6d 6f 64  base.** is unmod
38330 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
38340 6c 69 74 65 33 50 61 67 65 72 4f 6b 54 6f 43 68  lite3PagerOkToCh
38350 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  angeJournalMode(
38360 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
38370 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
38380 4d 6f 64 69 66 69 65 64 20 29 20 72 65 74 75 72  Modified ) retur
38390 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
383a0 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  (isOpen(pPager->
383b0 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
383c0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 20  journalOff>0) ) 
383d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
383e0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 1;.}../*.** G
383f0 65 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d  et/set the size-
38400 6c 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70  limit used for p
38410 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
38420 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  l files..**.** S
38430 65 74 74 69 6e 67 20 74 68 65 20 73 69 7a 65 20  etting the size 
38440 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e  limit to -1 mean
38450 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e  s no limit is en
38460 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74  forced..** An at
38470 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 6c  tempt to set a l
38480 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20 74 68 61  imit smaller tha
38490 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n -1 is a no-op.
384a0 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50  .*/.i64 sqlite3P
384b0 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c  agerJournalSizeL
384c0 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
384d0 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b  er, i64 iLimit){
384e0 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d  .  if( iLimit>=-
384f0 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 ){.    pPager-
38500 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
38510 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a  t = iLimit;.  }.
38520 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
38530 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
38540 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
38550 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
38560 74 68 65 20 70 50 61 67 65 72 2d 3e 70 42 61 63  the pPager->pBac
38570 6b 75 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68  kup variable. Th
38580 65 20 62 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a  e backup module.
38590 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d  ** in backup.c m
385a0 61 69 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e  aintains the con
385b0 74 65 6e 74 20 6f 66 20 74 68 69 73 20 76 61 72  tent of this var
385c0 69 61 62 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75  iable. This modu
385d0 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74 20 6f 70  le.** uses it op
385e0 61 71 75 65 6c 79 20 61 73 20 61 6e 20 61 72 67  aquely as an arg
385f0 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33  ument to sqlite3
38600 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 29 20  BackupRestart() 
38610 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61  and.** sqlite3Ba
38620 63 6b 75 70 55 70 64 61 74 65 28 29 20 6f 6e 6c  ckupUpdate() onl
38630 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61  y..*/.sqlite3_ba
38640 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65 33 50 61  ckup **sqlite3Pa
38650 67 65 72 42 61 63 6b 75 70 50 74 72 28 50 61 67  gerBackupPtr(Pag
38660 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
38670 65 74 75 72 6e 20 26 70 50 61 67 65 72 2d 3e 70  eturn &pPager->p
38680 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 69 66 6e 64  Backup;.}..#ifnd
38690 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
386a0 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
386b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
386c0 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 69   when the user i
386d0 6e 76 6f 6b 65 73 20 22 50 52 41 47 4d 41 20 63  nvokes "PRAGMA c
386e0 68 65 63 6b 70 6f 69 6e 74 22 2e 0a 2a 2f 0a 69  heckpoint"..*/.i
386f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
38700 68 65 63 6b 70 6f 69 6e 74 28 50 61 67 65 72 20  heck