/ Hex Artifact Content
Login

Artifact 29b5eeb8bab35c33b3d698bd29ccf701c0f35173:


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 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6f 6e  ** If the option
4dc0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 44 55   SQLITE_EXTRA_DU
4dd0: 52 41 42 4c 45 20 6f 70 74 69 6f 6e 20 69 73 20  RABLE option is 
4de0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  set at compile-t
4df0: 69 6d 65 2c 20 74 68 65 6e 0a 2a 2a 20 53 51 4c  ime, then.** SQL
4e00: 69 74 65 20 77 69 6c 6c 20 64 6f 20 65 78 74 72  ite will do extr
4e10: 61 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61 74  a fsync() operat
4e20: 69 6f 6e 73 20 77 68 65 6e 20 73 79 6e 63 68 72  ions when synchr
4e30: 6f 6e 6f 75 73 3d 3d 46 55 4c 4c 20 74 6f 20 68  onous==FULL to h
4e40: 65 6c 70 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68  elp.** ensure th
4e50: 61 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  at transactions 
4e60: 61 72 65 20 64 75 72 61 62 6c 65 20 61 63 72 6f  are durable acro
4e70: 73 73 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ss a power failu
4e80: 72 65 2e 20 20 4d 6f 73 74 0a 2a 2a 20 61 70 70  re.  Most.** app
4e90: 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 20 68 61  lications are ha
4ea0: 70 70 79 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ppy as long as t
4eb0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
4ec0: 63 6f 6e 73 69 73 74 65 6e 74 20 61 63 72 6f 73  consistent acros
4ed0: 73 0a 2a 2a 20 61 20 70 6f 77 65 72 20 66 61 69  s.** a power fai
4ee0: 6c 75 72 65 2c 20 61 6e 64 20 61 72 65 20 70 65  lure, and are pe
4ef0: 72 66 65 63 74 6c 79 20 77 69 6c 6c 69 6e 67 20  rfectly willing 
4f00: 74 6f 20 6c 6f 73 65 20 74 68 65 20 6c 61 73 74  to lose the last
4f10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
4f20: 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
4f30: 74 68 65 20 65 78 74 72 61 20 70 65 72 66 6f 72  the extra perfor
4f40: 6d 61 6e 63 65 20 6f 66 20 61 76 6f 69 64 69 6e  mance of avoidin
4f50: 67 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  g directory sync
4f60: 73 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 74 68 65  s..** And so the
4f70: 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f   default SQLITE_
4f80: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 20 73 65  EXTRA_DURABLE se
4f90: 74 74 69 6e 67 20 69 73 20 6f 66 66 2e 0a 2a 2f  tting is off..*/
4fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4fb0: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 0a 23 20  EXTRA_DURABLE.# 
4fc0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 58  define SQLITE_EX
4fd0: 54 52 41 5f 44 55 52 41 42 4c 45 20 30 0a 23 65  TRA_DURABLE 0.#e
4fe0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ndif.../*.** An 
4ff0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5000: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5010: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
5020: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
5030: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
5040: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
5050: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
5060: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
5070: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
5080: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
5090: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
50a0: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
50b0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
50c0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
50d0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
50e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
50f0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
5100: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
5110: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
5120: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
5130: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
5140: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
5150: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
5160: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
5170: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
5180: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
5190: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
51a0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
51b0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
51c0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
51d0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
51e0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
51f0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
5200: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
5210: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
5220: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
5230: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
5240: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
5250: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
5260: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
5270: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
5280: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
5290: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
52a0: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
52b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
52c0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
52f0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
5300: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
5310: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
5320: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
5330: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
5340: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
5350: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
5360: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
5370: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
5380: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
5390: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
53a0: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
53b0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
53c0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
53e0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
53f0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
5400: 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
5410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
5420: 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b  .  u32 aWalData[
5430: 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44  WAL_SAVEPOINT_ND
5440: 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  ATA];        /* 
5450: 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f  WAL savepoint co
5460: 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  ntext */.#endif.
5470: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20 6f  };../*.** Bits o
5480: 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e 6f  f the Pager.doNo
5490: 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53 65  tSpill flag.  Se
54a0: 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72 69  e further descri
54b0: 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f 0a  ption below..*/.
54c0: 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41  #define SPILLFLA
54d0: 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30 78  G_OFF         0x
54e0: 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69 6c  01 /* Never spil
54f0: 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76 69  l cache.  Set vi
5500: 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65 66  a pragma */.#def
5510: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  ine SPILLFLAG_RO
5520: 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20 2f  LLBACK    0x02 /
5530: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5540: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5550: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5560: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5570: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f 2a  YNC      0x04 /*
5580: 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62 75   Spill is ok, bu
5590: 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a 2f  t do not sync */
55a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e 20  ../*.** An open 
55b0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
55c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
55d0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
55e0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
55f0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
5600: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
5610: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
5620: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5630: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5640: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5650: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5660: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5670: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5680: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5690: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
56a0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
56b0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
56c0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
56d0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
56e0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
56f0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
5700: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5710: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
5720: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5730: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5740: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5750: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5760: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5770: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5780: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5790: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
57a0: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
57b0: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
57c0: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
57d0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
57e0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
57f0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
5800: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
5810: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
5820: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5830: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5840: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5850: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5860: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5870: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5880: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5890: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
58a0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
58b0: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
58c0: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
58d0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
58e0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
58f0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
5900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
5910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
5920: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5930: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5940: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5950: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5960: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5970: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5980: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5990: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
59a0: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
59b0: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
59c0: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
59d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
59e0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
59f0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
5a00: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
5a10: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
5a20: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5a30: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5a40: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5a50: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5a60: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5a70: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5a80: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5a90: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5aa0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5ab0: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5ac0: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
5ad0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
5ae0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
5af0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
5b00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5b10: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
5b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5b30: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5b40: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5b50: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5b60: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5b70: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5b80: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5b90: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5ba0: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5bb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5bc0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
5bd0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
5be0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
5bf0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
5c00: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
5c10: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
5c20: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5c30: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5c40: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5c50: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5c60: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5c70: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5c80: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5c90: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5ca0: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5cb0: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5cc0: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5cd0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ce0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5cf0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5d00: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5d10: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5d20: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5d30: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5d40: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5d50: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5d70: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5d90: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5da0: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5db0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5dc0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5dd0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5de0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5df0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5e00: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5e10: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5e20: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5e30: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5e40: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5e50: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5e60: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5e70: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5e80: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5e90: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5ea0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5eb0: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5ec0: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ed0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5ee0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5ef0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5f00: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5f10: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5f20: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5f30: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5f40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5f50: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5f60: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5f70: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5f80: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5f90: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5fa0: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5fb0: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5fc0: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5fd0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5fe0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5ff0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
6000: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
6010: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
6020: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
6030: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
6040: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
6050: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
6060: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
6070: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
6080: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
6090: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
60a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
60b0: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
60c0: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
60d0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
60e0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
60f0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
6100: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
6110: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
6120: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
6130: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
6140: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
6150: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
6160: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
6170: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
6180: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
6190: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
61a0: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
61b0: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
61c0: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
61d0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
61e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
61f0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
6200: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
6210: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
6220: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6230: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6240: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6250: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6260: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6270: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6280: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6290: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
62a0: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
62b0: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
62c0: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
62d0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
62e0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
62f0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
6300: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6310: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6320: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6330: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6340: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6350: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6360: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6370: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6380: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6390: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
63a0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
63b0: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
63c0: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
63d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
63e0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
63f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6400: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
6410: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
6420: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6430: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6440: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6450: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6460: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6470: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6480: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6490: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
64a0: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
64b0: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
64c0: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 0a  e database from.
64d0: 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73 73  **   pagerStress
64e0: 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c  () is permitted,
64f0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
6500: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
6510: 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20   not..**   This 
6520: 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 73  flag is set by s
6530: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6540: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6550: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6560: 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72 67  ize.**   is larg
6570: 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
6580: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6590: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
65a0: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
65b0: 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70 70  c.**   from happ
65c0: 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65 6e  ening in between
65d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
65e0: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
65f0: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
6600: 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d  . .**.** subjInM
6610: 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68  emory.**.**   Th
6620: 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20  is is a boolean 
6630: 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75  variable. If tru
6640: 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  e, then any requ
6650: 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  ired sub-journal
6660: 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20  .**   is opened 
6670: 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
6680: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6690: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d   false, then in-
66a0: 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d  memory.**   sub-
66b0: 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c  journals are onl
66c0: 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  y used for in-me
66d0: 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  mory pager files
66e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76  ..**.**   This v
66f0: 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61 74  ariable is updat
6700: 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72 20  ed by the upper 
6710: 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65 20  layer each time 
6720: 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69 74  a new .**   writ
6730: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6740: 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 64   opened..**.** d
6750: 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a  bSize, dbOrigSiz
6760: 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  e, dbFileSize.**
6770: 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20 64  .**   Variable d
6780: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
6790: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
67a0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
67b0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
67c0: 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50 41  t is valid in PA
67d0: 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20 68  GER_READER and h
67e0: 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61 6c  igher states (al
67f0: 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74 20  l states except 
6800: 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61 6e  for.**   OPEN an
6810: 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a 2a  d ERROR). .**.**
6820: 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65 74     dbSize is set
6830: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
6840: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
6850: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
6860: 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72 67  ay be .**   larg
6870: 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a 65  er than the size
6880: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
6890: 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72   (the value stor
68a0: 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ed at offset.** 
68b0: 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74 61    28 of the data
68c0: 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20 74  base header by t
68d0: 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74 68  he btree). If th
68e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
68f0: 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61  le.**   is not a
6900: 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
6910: 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
6920: 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20 73  ize, the value s
6930: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64 62  tored in.**   db
6940: 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64 20  Size is rounded 
6950: 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b 42  down (i.e. a 5KB
6960: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6970: 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53 69  ge-size has dbSi
6980: 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78 63  ze==2)..**   Exc
6990: 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74 68  ept, any file th
69a0: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
69b0: 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
69c0: 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
69d0: 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61 74  .**   to have at
69e0: 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e   least one page.
69f0: 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69 6c   (i.e. a 1KB fil
6a00: 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d 73  e with 2K page-s
6a10: 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20 74  ize leads.**   t
6a20: 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a 2a  o dbSize==1)..**
6a30: 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20 77  .**   During a w
6a40: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a50: 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68 20  , if pages with 
6a60: 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72 65  page-numbers gre
6a70: 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 64  ater than.**   d
6a80: 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66 69  bSize are modifi
6a90: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
6aa0: 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74   dbSize is updat
6ab0: 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ed accordingly..
6ac0: 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c 20  **   Similarly, 
6ad0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
6ae0: 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73 69  is truncated usi
6af0: 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74 65  ng PagerTruncate
6b00: 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20 64  Image(), .**   d
6b10: 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65 64  bSize is updated
6b20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  ..**.**   Variab
6b30: 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20 61  les dbOrigSize a
6b40: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61 72  nd dbFileSize ar
6b50: 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74 65  e valid in state
6b60: 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57 52  s .**   PAGER_WR
6b70: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  ITER_LOCKED and 
6b80: 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53 69  higher. dbOrigSi
6b90: 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ze is a copy of 
6ba0: 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20 20  the dbSize.**   
6bb0: 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65 20  variable at the 
6bc0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
6bd0: 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
6be0: 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c 6c  used during roll
6bf0: 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20 74  back,.**   and t
6c00: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
6c10: 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65 73  her or not pages
6c20: 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
6c30: 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a 2a  nalled before.**
6c40: 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65     being modifie
6c50: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f 75  d..**.**   Throu
6c60: 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74 72  ghout a write-tr
6c70: 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69 6c  ansaction, dbFil
6c80: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
6c90: 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20 20  he size of.**   
6ca0: 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
6cb0: 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69 73   in pages. It is
6cc0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6cd0: 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74 68  f dbSize when th
6ce0: 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72 61  e.**   write-tra
6cf0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72 73  nsaction is firs
6d00: 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75 70  t opened, and up
6d10: 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20 63  dated when VFS c
6d20: 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a  alls are made.**
6d30: 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20 74     to write or t
6d40: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
6d50: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
6d60: 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  k. .**.**   The 
6d70: 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65 20  only reason the 
6d80: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
6d90: 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ble is required 
6da0: 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20 0a  is to suppress .
6db0: 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72 79  **   unnecessary
6dc0: 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e 63   calls to xTrunc
6dd0: 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d 6d  ate() after comm
6de0: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
6df0: 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20 20  tion. If, .**   
6e00: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
6e10: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
6e20: 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20   the dbFileSize 
6e30: 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61 74  variable indicat
6e40: 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74 68  es .**   that th
6e50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6e60: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6e70: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
6e80: 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65 29  e (Pager.dbSize)
6e90: 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  , .**   pager_tr
6ea0: 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c 6c  uncate() is call
6eb0: 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74 72  ed. The pager_tr
6ec0: 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
6ed0: 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a 2a  es xFilesize().*
6ee0: 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20 74  *   to measure t
6ef0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6f00: 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74 68   on disk, and th
6f10: 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74 20  en truncates it 
6f20: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  if required..** 
6f30: 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73 20    dbFileSize is 
6f40: 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72 6f  not used when ro
6f50: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
6f60: 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
6f70: 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67 65  s case.**   page
6f80: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6f90: 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74 69  called unconditi
6fa0: 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d 65  onally (which me
6fb0: 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62 65  ans there may be
6fc0: 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f 20  .**   a call to 
6fd0: 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61 74  xFilesize() that
6fe0: 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c 79   is not strictly
6ff0: 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20 65   required). In e
7000: 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20 20  ither case,.**  
7010: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
7020: 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  ) may cause the 
7030: 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20 73  file to become s
7040: 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65 72  maller or larger
7050: 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53 69  ..**.** dbHintSi
7060: 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ze.**.**   The d
7070: 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61 62  bHintSize variab
7080: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c 69  le is used to li
7090: 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  mit the number o
70a0: 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f 0a  f calls made to.
70b0: 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46 69  **   the VFS xFi
70c0: 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f  leControl(FCNTL_
70d0: 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f  SIZE_HINT) metho
70e0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48 69  d. .**.**   dbHi
70f0: 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  ntSize is set to
7100: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64   a copy of the d
7110: 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 77  bSize variable w
7120: 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74 65  hen a.**   write
7130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
7140: 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20 73  opened (at the s
7150: 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46 69  ame time as dbFi
7160: 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20 20  leSize and.**   
7170: 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66 20  dbOrigSize). If 
7180: 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
7190: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
71a0: 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  ) method is call
71b0: 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74 53  ed,.**   dbHintS
71c0: 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  ize is increased
71d0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
71e0: 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f 72  f pages that cor
71f0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a 2a  respond to the.*
7200: 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70 61  *   size-hint pa
7210: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74 68  ssed to the meth
7220: 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61 67  od call. See pag
7230: 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
7240: 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64 65  t() for .**   de
7250: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72 72  tails..**.** err
7260: 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  Code.**.**   The
7270: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
7280: 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79 20  ariable is only 
7290: 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41 47  ever used in PAG
72a0: 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
72b0: 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74  It.**   is set t
72c0: 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f 74  o zero in all ot
72d0: 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20 50  her states. In P
72e0: 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
72f0: 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  , Pager.errCode 
7300: 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73 20  .**   is always 
7310: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 55  set to SQLITE_FU
7320: 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
7330: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 53   or one of the S
7340: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
7350: 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73 2e  .**   sub-codes.
7360: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
7370: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
7380: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
7390: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
73a0: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
73b0: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
73c0: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
73d0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
73e0: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
73f0: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
7400: 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b   u8 journalMode;
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7420: 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52  One of the PAGER
7430: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
7440: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73  alues */.  u8 us
7450: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
7460: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
7470: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
7480: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
7490: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74b0: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
74c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
74d0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
74e0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
74f0: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
7500: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
7510: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
7520: 73 73 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53  ss */.  u8 ckptS
7530: 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20  yncFlags;       
7540: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7550: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7560: 66 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a  for checkpoint *
7570: 2f 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c  /.  u8 walSyncFl
7580: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7590: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
75a0: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20  r SYNC_FULL for 
75b0: 77 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20  wal writes */.  
75c0: 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20  u8 syncFlags;   
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
75e0: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
75f0: 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73  NC_FULL otherwis
7600: 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  e */.  u8 tempFi
7610: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
7620: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
7630: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f  is a temporary o
7640: 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65  r immutable file
7650: 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b   */.  u8 noLock;
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b    /* Do not lock
7680: 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20   (except in WAL 
7690: 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65  mode) */.  u8 re
76a0: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
76b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
76c0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
76d0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
76e0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
76f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7700: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
7710: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
7720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20  **********.  ** 
7770: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7780: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
7790: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
77a0: 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72   that change dur
77b0: 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ing.  ** routine
77c0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61   operation.  Cla
77d0: 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69  ss members not i
77e0: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65  n this block are
77f0: 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20   either fixed.  
7800: 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ** when the page
7810: 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74  r is first creat
7820: 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20  ed or else only 
7830: 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72  change when ther
7840: 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e  e is a.  ** sign
7850: 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61  ificant mode cha
7860: 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61  nge (such as cha
7870: 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73  nging the page_s
7880: 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  ize, locking_mod
7890: 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a  e,.  ** or the j
78a0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46  ournal_mode).  F
78b0: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77  rom another view
78c0: 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65  , these class me
78d0: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20  mbers describe. 
78e0: 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20   ** the "state" 
78f0: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68  of the pager, wh
7900: 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20  ile other class 
7910: 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65  members describe
7920: 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69   the.  ** "confi
7930: 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65  guration" of the
7940: 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75   pager..  */.  u
7950: 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  8 eState;       
7960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7970: 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c  ger state (OPEN,
7980: 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f   READER, WRITER_
7990: 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75  LOCKED..) */.  u
79a0: 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  8 eLock;        
79b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
79c0: 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20  rrent lock held 
79d0: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
79e0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
79f0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
7a00: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
7a10: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
7a20: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
7a30: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
7a40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7a50: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
7a60: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
7a70: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
7a80: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c  /.  u8 doNotSpil
7a90: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7aa0: 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  /* Do not spill 
7ab0: 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e  the cache when n
7ac0: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20  on-zero */.  u8 
7ad0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20  subjInMemory;   
7ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7af0: 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72   to use in-memor
7b00: 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  y sub-journals *
7b10: 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68  /.  u8 bUseFetch
7b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7b30: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78  /* True to use x
7b40: 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20  Fetch() */.  u8 
7b50: 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
7b60: 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  k;       /* True
7b70: 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63   if a shared loc
7b80: 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20  k has ever been 
7b90: 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  held */.  Pgno d
7ba0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
7bb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7bc0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
7bd0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
7be0: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
7bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
7c00: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
7c10: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
7c20: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
7c30: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
7c40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7c50: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
7c60: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7c70: 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65   Pgno dbHintSize
7c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7c90: 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  Value passed to 
7ca0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
7cb0: 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72  call */.  int er
7cc0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
7cd0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
7ce0: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
7cf0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
7d00: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
7d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
7d20: 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e  s journalled sin
7d30: 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72  ce last j-header
7d40: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33   written */.  u3
7d50: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
7d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
7d70: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
7d80: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
7d90: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32  hecksum */.  u32
7da0: 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   nSubRec;       
7db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7dc0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72  er of records wr
7dd0: 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75  itten to sub-jou
7de0: 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63  rnal */.  Bitvec
7df0: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
7e00: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
7e10: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
7e20: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7e30: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
7e40: 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
7e50: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7e60: 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61  criptor for data
7e70: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
7e80: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
7e90: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ea0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69  scriptor for mai
7eb0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  n journal */.  s
7ec0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66  qlite3_file *sjf
7ed0: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
7ee0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7ef0: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  r sub-journal */
7f00: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
7f10: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
7f20: 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20  * Current write 
7f30: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
7f40: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7f50: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7f70: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
7f80: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
7f90: 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  eader */.  sqlit
7fa0: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
7fb0: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
7fc0: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
7fd0: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
7fe0: 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72  esses */.  Pager
7ff0: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
8000: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
8010: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
8020: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
8030: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
8040: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8050: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
8060: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  Savepoint[] */. 
8070: 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f   u32 iDataVersio
8080: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
8090: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
80a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
80b0: 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63  t changes */.  c
80c0: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
80d0: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
80e0: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
80f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
8100: 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  nges */..  int n
8110: 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20  MmapOut;        
8120: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8130: 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63   of mmap pages c
8140: 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e  urrently outstan
8150: 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ding */.  sqlite
8160: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20  3_int64 szMmap; 
8170: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64        /* Desired
8180: 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69   maximum mmap si
8190: 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ze */.  PgHdr *p
81a0: 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20  MmapFreelist;   
81b0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
81c0: 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65  ree mmap page he
81d0: 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a  aders (pDirty) *
81e0: 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20  /.  /*.  ** End 
81f0: 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79  of the routinely
8200: 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20  -changing class 
8210: 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a  members.  ******
8220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8260: 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  *****/..  u16 nE
8270: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
8280: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
8290: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
82a0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
82b0: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
82c0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
82d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
82e0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
82f0: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
8300: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
8310: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
8320: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
8330: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
8340: 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65  en() */.  u32 se
8350: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
8360: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
8370: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
8380: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
8390: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
83b0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
83c0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
83d0: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
83f0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
8400: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
8410: 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ase */.  i64 jou
8420: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
8430: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
8440: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
8450: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
8460: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
8470: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
8480: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8490: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
84a0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
84b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
84c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
84d0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
84e0: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
84f0: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
8500: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
8510: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
8520: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
8530: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
8540: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
8550: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
8560: 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33  */.  int aStat[3
8570: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
8580: 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20   /* Total cache 
8590: 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64  hits, misses and
85a0: 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65   writes */.#ifde
85b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
85c0: 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20  int nRead;      
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
85e0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
85f0: 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  ad */.#endif.  v
8600: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
8610: 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61  (DbPage*); /* Ca
8620: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
8630: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
8640: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
8650: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
8660: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
8670: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
8680: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
8690: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
86a0: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
86b0: 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
86c0: 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
86d0: 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f  nt); /* Notify o
86e0: 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e  f page size chan
86f0: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
8700: 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
8710: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
8720: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
8730: 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20  r the codec */. 
8740: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20   void *pCodec;  
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8760: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
8770: 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68  o xCodec... meth
8780: 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ods */.#endif.  
8790: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
87b0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
87c0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
87d0: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43   tmp use */.  PC
87e0: 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20  ache *pPCache;  
87f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8800: 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63  nter to page cac
8810: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66  he object */.#if
8820: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8830: 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c  _WAL.  Wal *pWal
8840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8850: 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61     /* Write-ahea
8860: 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a  d log used by "j
8870: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22  ournal_mode=wal"
8880: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c   */.  char *zWal
8890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
88a0: 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66    /* File name f
88b0: 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  or write-ahead l
88c0: 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  og */.#endif.};.
88d0: 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66  ./*.** Indexes f
88e0: 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65  or use with Page
88f0: 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50  r.aStat[]. The P
8900: 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72  ager.aStat[] arr
8910: 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  ay contains.** t
8920: 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73  he values access
8930: 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51  ed by passing SQ
8940: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
8950: 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d  CHE_HIT, CACHE_M
8960: 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45  ISS .** or CACHE
8970: 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65  _WRITE to sqlite
8980: 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a  3_db_status()..*
8990: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
89a0: 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65  STAT_HIT   0.#de
89b0: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
89c0: 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20  MISS  1.#define 
89d0: 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
89e0: 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f   2../*.** The fo
89f0: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
8a00: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
8a10: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
8a20: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
8a30: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
8a40: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
8a50: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
8a60: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
8a70: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
8a80: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
8a90: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
8aa0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
8ab0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8ac0: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
8ad0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8ae0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
8af0: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
8b00: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8b10: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
8b20: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
8b30: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
8b40: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
8b50: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8b60: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
8b70: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8b80: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
8b90: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20  to journal */.# 
8ba0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
8bb0: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
8bc0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
8bd0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
8be0: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
8bf0: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
8c00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
8c10: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
8c20: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
8c30: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
8c40: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
8c50: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
8c60: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
8c70: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
8c80: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
8c90: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
8ca0: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
8cb0: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
8cc0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
8cd0: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
8ce0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
8cf0: 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  nal is being.** 
8d00: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
8d10: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
8d20: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
8d30: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
8d40: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
8d50: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
8d60: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
8d70: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
8d80: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
8d90: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
8da0: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
8db0: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
8dc0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
8dd0: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
8de0: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
8df0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
8e00: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
8e10: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
8e20: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
8e30: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
8e40: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
8e50: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
8e60: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
8e70: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
8e80: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
8e90: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
8ea0: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
8eb0: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
8ec0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
8ed0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
8ee0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
8ef0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
8f00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
8f10: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
8f20: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
8f30: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
8f40: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
8f50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
8f60: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
8f70: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
8f80: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
8f90: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
8fa0: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
8fb0: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
8fc0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
8fd0: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
8fe0: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
8ff0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
9000: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
9010: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
9020: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
9030: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
9040: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
9050: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
9060: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
9070: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
9080: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
9090: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
90a0: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
90b0: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
90c0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
90d0: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
90e0: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
90f0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
9100: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
9110: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
9120: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
9130: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
9140: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
9150: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
9160: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
9170: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65   of each page re
9180: 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  cord in the jour
9190: 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a  nal is given by.
91a0: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
91b0: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69   macro..*/.#defi
91c0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
91d0: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
91e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
91f0: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
9200: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
9210: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
9220: 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
9230: 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73  y the same .** s
9240: 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ize as a single 
9250: 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65  disk sector. See
9260: 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53   also setSectorS
9270: 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ize()..*/.#defin
9280: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
9290: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
92a0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
92b0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
92c0: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
92d0: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
92e0: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
92f0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
9300: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
9310: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
9320: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
9330: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
9340: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
9350: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
9360: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
9370: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
9380: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
9390: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
93a0: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
93b0: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
93c0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
93d0: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
93e0: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
93f0: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
9400: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
9410: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55  *.** The macro U
9420: 53 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20  SEFETCH is true 
9430: 69 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65  if we are allowe
9440: 64 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65  d to use the xFe
9450: 74 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68  tch and xUnfetch
9460: 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74  .** interfaces t
9470: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
9480: 61 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f  abase using memo
9490: 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a  ry-mapped I/O..*
94a0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
94b0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64  _MMAP_SIZE>0.# d
94c0: 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78  efine USEFETCH(x
94d0: 29 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63  ) ((x)->bUseFetc
94e0: 68 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  h).#else.# defin
94f0: 65 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a  e USEFETCH(x) 0.
9500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
9510: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
9520: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
9530: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
9540: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
9550: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
9560: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
9570: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
9580: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
9590: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
95a0: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
95b0: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
95c0: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
95d0: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
95e0: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
95f0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
9600: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
9610: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
9620: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
9630: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
9640: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
9650: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
9660: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
9670: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
9680: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
9690: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
96a0: 29 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a  )->pMethods!=0).
96b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
96c0: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
96d0: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
96e0: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
96f0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
9700: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
9710: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
9720: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
9730: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
9740: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
9750: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
9760: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
9770: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
9780: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
9790: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
97a0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
97b0: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
97c0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
97d0: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
97e0: 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  y) 0.# define pa
97f0: 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
9800: 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ent(z) SQLITE_OK
9810: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42  .# define pagerB
9820: 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
9830: 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ion(z) SQLITE_OK
9840: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
9850: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
9860: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
9870: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
9880: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
9890: 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66   );.**.** This f
98a0: 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e  unction runs man
98b0: 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79  y asserts to try
98c0: 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69   to find inconsi
98d0: 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74  stencies in.** t
98e0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
98f0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
9900: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
9910: 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65   int assert_page
9920: 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  r_state(Pager *p
9930: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
9940: 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74  er = p;..  /* St
9950: 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ate must be vali
9960: 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  d. */.  assert( 
9970: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9980: 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20  _OPEN.       || 
9990: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
99a0: 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c  _READER.       |
99b0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
99c0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
99d0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
99e0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
99f0: 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
9a00: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9a10: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
9a20: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9a30: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9a40: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20  RITER_FINISHED. 
9a50: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9a60: 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a  te==PAGER_ERROR.
9a70: 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72    );..  /* Regar
9a80: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72  dless of the cur
9a90: 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65  rent state, a te
9aa0: 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69  mp-file connecti
9ab0: 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65  on always behave
9ac0: 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20  s.  ** as if it 
9ad0: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
9ae0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
9af0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e  abase file. It n
9b00: 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a  ever updates.  *
9b10: 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  * the change-cou
9b20: 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74  nter field, so t
9b30: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
9b40: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
9b50: 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  s set..  */.  as
9b60: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9b70: 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b  e==0 || p->eLock
9b80: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
9b90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9ba0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9bb0: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
9bc0: 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a  untDone );..  /*
9bd0: 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e   If the useJourn
9be0: 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  al flag is clear
9bf0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  , the journal-mo
9c00: 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22  de must be "OFF"
9c10: 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74  . .  ** And if t
9c20: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9c30: 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f  is "OFF", the jo
9c40: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
9c50: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a  not be open..  *
9c60: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  /.  assert( p->j
9c70: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9c80: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9c90: 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e  F || p->useJourn
9ca0: 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
9cb0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  p->journalMode!=
9cc0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9cd0: 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e  E_OFF || !isOpen
9ce0: 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  (p->jfd) );..  /
9cf0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d  * Check that MEM
9d00: 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e  DB implies noSyn
9d10: 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d  c. And an in-mem
9d20: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e  ory journal. Sin
9d30: 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65  ce .  ** this me
9d40: 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ans an in-memory
9d50: 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20   pager performs 
9d60: 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74  no IO at all, it
9d70: 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65   cannot encounte
9d80: 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53  r .  ** either S
9d90: 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53  QLITE_IOERR or S
9da0: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e  QLITE_FULL durin
9db0: 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68  g rollback or wh
9dc0: 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a  ile finalizing .
9dd0: 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66    ** a journal f
9de0: 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74  ile. (although t
9df0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  he in-memory jou
9e00: 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rnal implementat
9e10: 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65  ion may .  ** re
9e20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
9e30: 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68  R_NOMEM while th
9e40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
9e50: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29  s being written)
9e60: 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68  . It .  ** is th
9e70: 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73  erefore not poss
9e80: 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ible for an in-m
9e90: 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65  emory pager to e
9ea0: 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a  nter the ERROR .
9eb0: 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f    ** state..  */
9ec0: 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
9ed0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
9ee0: 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  oSync );.    ass
9ef0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9f00: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9f10: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9f20: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
9f30: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9f40: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
9f50: 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73   .    );.    ass
9f60: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d  ert( p->eState!=
9f70: 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
9f80: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
9f90: 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65  OPEN );.    asse
9fa0: 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
9fb0: 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  p)==0 );.  }..  
9fc0: 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e  /* If changeCoun
9fd0: 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20  tDone is set, a 
9fe0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72  RESERVED lock or
9ff0: 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
a000: 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68   held.  ** on th
a010: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  e file..  */.  a
a020: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
a030: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d  hangeCountDone==
a040: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
a050: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a060: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
a070: 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ->eLock!=PENDING
a080: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74  _LOCK );..  swit
a090: 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b  ch( p->eState ){
a0a0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a0b0: 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  OPEN:.      asse
a0c0: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
a0d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a0e0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a0f0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a100: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a110: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
a120: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
a130: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
a140: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
a150: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a160: 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20  PAGER_READER:.  
a170: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a180: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a190: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a1a0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a1b0: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
a1c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1d0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  p->eLock>=SHARED
a1e0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62  _LOCK );.      b
a1f0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a200: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
a210: 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  KED:.      asser
a220: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a230: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a240: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a250: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a260: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a270: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a280: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a290: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a2a0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a2b0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
a2c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a2d0: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
a2e0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
a2f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a300: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a310: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a320: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a330: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a340: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a350: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a360: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a370: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a380: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
a390: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a3a0: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a3b0: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
a3c0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a3d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a3e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a3f0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a400: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a410: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a420: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a430: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
a440: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
a450: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
a460: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
a470: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a480: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
a490: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
a4a0: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
a4b0: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
a4c0: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
a4d0: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
a4e0: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
a4f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
a500: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
a510: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a520: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a540: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a550: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
a560: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a570: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a580: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a590: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a5a0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a5c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a5d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a5e0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
a5f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a600: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a610: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a620: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
a630: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a640: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a650: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
a660: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a670: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a680: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
a690: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
a6a0: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a6b0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a6c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a6d0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a6e0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a6f0: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a700: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a710: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a720: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
a730: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a740: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a750: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a760: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a770: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a780: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a790: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a7a0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a7b0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a7c0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a7d0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a7e0: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
a7f0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a800: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a810: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a820: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
a830: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a840: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a850: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a860: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a870: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a880: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a890: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a8a0: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a8b0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
a8c0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
a8d0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a8e0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a8f0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a900: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a910: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a920: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a930: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a940: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a950: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
a960: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
a970: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
a980: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
a990: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
a9a0: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
a9b0: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
a9c0: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
a9d0: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
a9e0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
a9f0: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
aa00: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
aa10: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
aa20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
aa30: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
aa40: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
aa50: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
aa60: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
aa70: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
aa80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
aa90: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  }..  return 1;.}
aaa0: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
aab0: 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  f NDEBUG */..#if
aac0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
aad0: 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61   ./*.** Return a
aae0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75   pointer to a hu
aaf0: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72  man readable str
ab00: 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20  ing in a static 
ab10: 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69  buffer.** contai
ab20: 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f  ning the state o
ab30: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
ab40: 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  ct passed as an 
ab50: 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a  argument. This.*
ab60: 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  * is intended to
ab70: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
ab80: 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65  debuggers. For e
ab90: 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c  xample, as an al
aba0: 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20  ternative.** to 
abb0: 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20  "print *pPager" 
abc0: 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67  in gdb:.**.** (g
abd0: 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c  db) printf "%s",
abe0: 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61   print_pager_sta
abf0: 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74  te(pPager).*/.st
ac00: 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74  atic char *print
ac10: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
ac20: 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63  er *p){.  static
ac30: 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d   char zRet[1024]
ac40: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
ac50: 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74  rintf(1024, zRet
ac60: 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d  ,.      "Filenam
ac70: 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20  e:      %s\n".  
ac80: 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20      "State:     
ac90: 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25      %s errCode=%
aca0: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b  d\n".      "Lock
acb0: 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22  :          %s\n"
acc0: 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20  .      "Locking 
acd0: 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d  mode:  locking_m
ace0: 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20  ode=%s\n".      
acf0: 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20  "Journal mode:  
ad00: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c  journal_mode=%s\
ad10: 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e  n".      "Backin
ad20: 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c  g store: tempFil
ad30: 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73  e=%d memDb=%d us
ad40: 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20  eJournal=%d\n". 
ad50: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20       "Journal:  
ad60: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d       journalOff=
ad70: 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d  %lld journalHdr=
ad80: 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53  %lld\n".      "S
ad90: 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62  ize:          db
ada0: 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69  size=%d dbOrigSi
adb0: 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65  ze=%d dbFileSize
adc0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70  =%d\n".      , p
add0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20  ->zFilename.    
ade0: 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50    , p->eState==P
adf0: 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20  AGER_OPEN       
ae00: 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a       ? "OPEN" :.
ae10: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ae20: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
ae30: 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44           ? "READ
ae40: 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ER" :.        p-
ae50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ae60: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f  RITER_LOCKED   ?
ae70: 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22   "WRITER_LOCKED"
ae80: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ae90: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aea0: 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57  ER_CACHEMOD ? "W
aeb0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20  RITER_CACHEMOD" 
aec0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
aed0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
aee0: 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52  R_DBMOD    ? "WR
aef0: 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20  ITER_DBMOD" :.  
af00: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
af10: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
af20: 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52  NISHED ? "WRITER
af30: 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20  _FINISHED" :.   
af40: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
af50: 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20  PAGER_ERROR     
af60: 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20        ? "ERROR" 
af70: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
af80: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43    , (int)p->errC
af90: 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ode.      , p->e
afa0: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20  Lock==NO_LOCK   
afb0: 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b        ? "NO_LOCK
afc0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
afd0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
afe0: 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45  OCK   ? "RESERVE
aff0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
b000: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
b010: 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53  _LOCK  ? "EXCLUS
b020: 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70  IVE" :.        p
b030: 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
b040: 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52  LOCK     ? "SHAR
b050: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
b060: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
b070: 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f  LOCK    ? "UNKNO
b080: 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  WN" : "?error?".
b090: 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75        , p->exclu
b0a0: 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c  siveMode ? "excl
b0b0: 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c  usive" : "normal
b0c0: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  ".      , p->jou
b0d0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b0e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
b0f0: 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20  RY   ? "memory" 
b100: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b110: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b120: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
b130: 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20       ? "off" :. 
b140: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
b150: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b160: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
b170: 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20    ? "delete" :. 
b180: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
b190: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b1a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
b1b0: 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a    ? "persist" :.
b1c0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
b1d0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
b1e0: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
b1f0: 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20  TE ? "truncate" 
b200: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b210: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b220: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
b230: 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22       ? "wal" : "
b240: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
b250: 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c   (int)p->tempFil
b260: 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62  e, (int)p->memDb
b270: 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75  , (int)p->useJou
b280: 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e  rnal.      , p->
b290: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a  journalOff, p->j
b2a0: 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
b2b0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65  , (int)p->dbSize
b2c0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67  , (int)p->dbOrig
b2d0: 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62  Size, (int)p->db
b2e0: 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20  FileSize.  );.. 
b2f0: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
b300: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
b310: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
b320: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
b330: 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20  write page *pPg 
b340: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b350: 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20  rnal..** A page 
b360: 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74  needs to be writ
b370: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ten into the sub
b380: 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72  -journal if ther
b390: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20  e exists one.** 
b3a0: 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76  or more open sav
b3b0: 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63  epoints for whic
b3c0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  h:.**.**   * The
b3d0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b3e0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
b3f0: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
b400: 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a  oint.nOrig, and.
b410: 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63  **   * The bit c
b420: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
b430: 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
b440: 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a  is not set in.**
b450: 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
b460: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
b470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b480: 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
b490: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
b4a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
b4b0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
b4c0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
b4d0: 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
b4e0: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74  pPg->pgno;.  int
b4f0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b500: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
b510: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  int; i++){.    p
b520: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
b530: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
b540: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
b550: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
b560: 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c  itvecTestNotNull
b570: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
b580: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
b590: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
b5a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
b5b0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
b5c0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65  E_DEBUG./*.** Re
b5d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
b5e0: 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
b5f0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b600: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
b610: 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  int pageInJourna
b620: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
b630: 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
b640: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
b650: 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
b660: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
b670: 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69  ->pgno);.}.#endi
b680: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
b690: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b6a0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b6b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b6c0: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b6d0: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b6e0: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b6f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b700: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b710: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b720: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b730: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b740: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b750: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b760: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b770: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b780: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b790: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b7a0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b7b0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b7c0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b7d0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b7e0: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b7f0: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b800: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b810: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b820: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b830: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b840: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b850: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b860: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b870: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b880: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b890: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b8a0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b8b0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b8c0: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b8d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b8e0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b8f0: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b900: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b910: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b920: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b930: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b940: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b950: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b960: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b970: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b980: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b990: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b9a0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b9b0: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b9c0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b9d0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b9e0: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b9f0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
ba00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
ba10: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
ba20: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
ba30: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
ba40: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
ba50: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
ba60: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
ba70: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
ba80: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
ba90: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
baa0: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
bab0: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
bac0: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
bad0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
bae0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
baf0: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
bb00: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
bb10: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
bb20: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
bb30: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
bb40: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
bb50: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
bb60: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
bb70: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
bb80: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
bb90: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
bba0: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
bbb0: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
bbc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bbd0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
bbe0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
bbf0: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
bc00: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
bc10: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
bc20: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
bc30: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
bc40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
bc50: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
bc60: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
bc70: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
bc80: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
bc90: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
bca0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
bcb0: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
bcc0: 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b  = pPager->noLock
bcd0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73   ? SQLITE_OK : s
bce0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
bcf0: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bd00: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
bd10: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
bd20: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
bd30: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
bd40: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
bd50: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
bd60: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
bd70: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
bd80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
bd90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
bda0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
bdb0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
bdc0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
bdd0: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
bde0: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
bdf0: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
be00: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
be10: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
be20: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
be30: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
be40: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
be50: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
be60: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
be70: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
be80: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
be90: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
bea0: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
beb0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
bec0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
bed0: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bee0: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
bef0: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
bf00: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
bf10: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
bf20: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
bf30: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
bf40: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
bf50: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
bf60: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
bf70: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
bf80: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bf90: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
bfa0: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
bfb0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
bfc0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
bfd0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
bfe0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
bff0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
c000: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
c010: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
c020: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  K ){.    rc = pP
c030: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
c040: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
c050: 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
c060: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
c070: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c080: 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65  OK && (pPager->e
c090: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
c0a0: 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  CK||eLock==EXCLU
c0b0: 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  SIVE_LOCK) ){.  
c0c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
c0d0: 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20  k = (u8)eLock;. 
c0e0: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
c0f0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c100: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c110: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c120: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
c130: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
c140: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
c150: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
c160: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
c170: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
c180: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
c190: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
c1a0: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
c1b0: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
c1c0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
c1d0: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
c1e0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
c1f0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
c200: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
c210: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
c220: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
c230: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
c240: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
c250: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
c260: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
c270: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
c280: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
c290: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74  e..**.** The opt
c2a0: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73  imization is als
c2b0: 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64  o always enabled
c2c0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
c2d0: 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61  iles. It is.** a
c2e0: 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20  n error to call 
c2f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
c300: 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65   pPager is opene
c310: 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d on an in-memor
c320: 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  y.** database..*
c330: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
c340: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
c350: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
c360: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
c370: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
c380: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
c390: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
c3a0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c3b0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
c3c0: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
c3d0: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
c3e0: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
c3f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c400: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
c410: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
c420: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
c430: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
c440: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
c450: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
c460: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
c470: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c490: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
c4a0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
c4b0: 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20     int nSector; 
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73       /* Sector s
c4e0: 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ize */.    int s
c4f0: 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  zPage;          
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c510: 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  Page size */..  
c520: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
c530: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
c540: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
c550: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c560: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
c570: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
c580: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
c590: 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67  rSize;.    szPag
c5a0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
c5b0: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
c5c0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
c5d0: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
c5e0: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
c5f0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c600: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
c610: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
c620: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
c630: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
c640: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
c650: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
c660: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c670: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c680: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c690: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
c6a0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c6b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c6c0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
c6d0: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
c6e0: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
c6f0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
c700: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
c710: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
c720: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
c730: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
c740: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
c750: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
c760: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
c770: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
c780: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
c790: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
c7a0: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
c7b0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
c7c0: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
c7d0: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
c7e0: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
c7f0: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
c800: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
c810: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
c820: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
c830: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
c840: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
c850: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
c860: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
c870: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
c880: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
c890: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
c8a0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
c8b0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
c8c0: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
c8d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
c8e0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c8f0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
c900: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
c910: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c920: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
c930: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
c940: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
c950: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
c960: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
c970: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
c980: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
c990: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
c9a0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
c9b0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
c9c0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
c9d0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
c9e0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
c9f0: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
ca00: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
ca10: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
ca20: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
ca30: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
ca40: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
ca50: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
ca60: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
ca70: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
ca80: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
ca90: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
caa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
cab0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
cac0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
cad0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
cae0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
caf0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
cb00: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
cb10: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
cb20: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
cb30: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
cb40: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
cb50: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
cb60: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
cb70: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
cb80: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
cb90: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
cba0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
cbb0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
cbc0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
cbd0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
cbe0: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
cbf0: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
cc00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cc10: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
cc20: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
cc30: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
cc40: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
cc50: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
cc60: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
cc70: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
cc80: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
cc90: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
cca0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
ccb0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
ccc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ccd0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
cce0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
ccf0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
cd00: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
cd10: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
cd20: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
cd30: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
cd40: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
cd50: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
cd60: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
cd70: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
cd80: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
cd90: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
cda0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
cdb0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
cdc0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
cdd0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
cde0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
cdf0: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
ce00: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
ce10: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
ce20: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
ce30: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
ce40: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
ce50: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
ce60: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
ce70: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
ce80: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
ce90: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cea0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
ceb0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
cec0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
ced0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
cee0: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
cef0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
cf00: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
cf10: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
cf20: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
cf30: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
cf40: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
cf50: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
cf60: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
cf70: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
cf80: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
cf90: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cfa0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
cfb0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
cfc0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
cfd0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
cfe0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
cff0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
d000: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
d010: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
d020: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
d030: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
d040: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
d050: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
d060: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
d070: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
d080: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
d090: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0b0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
d0c0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d0e0: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
d0f0: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
d100: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
d110: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
d120: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
d130: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
d140: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
d150: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
d160: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
d170: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
d180: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
d190: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
d1a0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d1c0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
d1d0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
d1e0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
d1f0: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
d200: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
d210: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
d220: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
d230: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
d240: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d250: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
d260: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
d270: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
d280: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d290: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d2a0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
d2b0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
d2c0: 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30  er .   || len==0
d2d0: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
d2e0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
d2f0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
d300: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
d310: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d320: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
d330: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
d340: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
d350: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
d360: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
d370: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d380: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d390: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
d3a0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
d3b0: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
d3c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d3d0: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
d3e0: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
d3f0: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
d400: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
d410: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
d420: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
d430: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
d440: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
d450: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
d460: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
d470: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
d480: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
d490: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
d4a0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
d4b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d4c0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
d4d0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
d4e0: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
d4f0: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
d500: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
d510: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
d520: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
d530: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
d540: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
d550: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
d560: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
d570: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
d580: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d590: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
d5a0: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
d5b0: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
d5c0: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
d5d0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
d5e0: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
d5f0: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
d600: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
d610: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
d620: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
d630: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
d640: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
d650: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
d660: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
d670: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
d680: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
d690: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
d6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d6c0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d6e0: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
d750: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
d760: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
d770: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d780: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d790: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
d7a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
d7b0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
d7c0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
d7d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d7e0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
d7f0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d800: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
d810: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
d820: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d830: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
d840: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
d850: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
d860: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
d870: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
d880: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
d890: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d8a0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d8b0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
d8c0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d8d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d8e0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
d8f0: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
d900: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
d910: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
d920: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
d930: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
d940: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
d950: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
d960: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
d970: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
d980: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
d990: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
d9a0: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
d9b0: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
d9c0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d9d0: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
d9e0: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
d9f0: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
da00: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
da10: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
da20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
da30: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
da40: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
da50: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
da60: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
da70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
da80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
da90: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
daa0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
dab0: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
dac0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
dad0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
dae0: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
daf0: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
db00: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
db10: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
db20: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
db30: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
db40: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
db50: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
db60: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
db70: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
db80: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
db90: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
dba0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
dbb0: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
dbc0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
dbd0: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
dbe0: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
dbf0: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
dc00: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
dc10: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
dc20: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
dc30: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
dc40: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
dc50: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
dc60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
dc70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
dc80: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
dc90: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
dca0: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
dcb0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dcc0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
dcf0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
dd00: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
dd10: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
dd20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
dd30: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
dd40: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
dd50: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
dd60: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
dd70: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
dd80: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
dd90: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
dda0: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
ddb0: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
ddc0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
ddd0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
dde0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
ddf0: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
de00: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
de10: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
de20: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
de30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
de40: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
de50: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
de60: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
de70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
de80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
de90: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
dea0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
deb0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
dec0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
ded0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
dee0: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
def0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
df00: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
df10: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
df20: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
df30: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
df40: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
df50: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
df60: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
df70: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
df80: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
df90: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
dfa0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
dfb0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
dfc0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
dfd0: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
dfe0: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
dff0: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
e000: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
e010: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
e020: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
e030: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
e040: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
e050: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
e060: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e070: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
e080: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
e090: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e0a0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
e0b0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
e0c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e0d0: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
e0e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
e0f0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
e100: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
e110: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
e120: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
e130: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e140: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
e150: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
e160: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
e170: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
e180: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
e190: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e1a0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
e1b0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
e1c0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
e1d0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
e1e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
e1f0: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
e200: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
e210: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
e220: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
e230: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
e240: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
e250: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
e260: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
e270: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
e280: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
e290: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e2a0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
e2b0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
e2c0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e2d0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
e2e0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
e2f0: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
e300: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
e310: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
e320: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
e330: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
e340: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
e350: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
e360: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
e370: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
e380: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
e390: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
e3a0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
e3b0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e3c0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
e3d0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e3e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e3f0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
e400: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
e410: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e420: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
e430: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
e440: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
e450: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
e460: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
e470: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
e480: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
e490: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
e4a0: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e4d0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
e4e0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
e4f0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e510: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e520: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
e530: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e540: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
e550: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e560: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
e570: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
e580: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e590: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
e5a0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
e5b0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
e5c0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e5d0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
e5e0: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
e5f0: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
e600: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
e610: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
e620: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
e630: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
e640: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
e650: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
e660: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
e670: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
e680: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
e690: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
e6a0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
e6b0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
e6c0: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
e6d0: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
e6e0: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
e6f0: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
e700: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
e710: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
e720: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
e730: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e740: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
e750: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
e760: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
e770: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
e780: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e790: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
e7a0: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
e7b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e7c0: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
e7d0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e7e0: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
e7f0: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
e800: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
e810: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
e820: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
e830: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
e840: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
e850: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
e860: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
e870: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
e880: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
e890: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
e8a0: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
e8b0: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
e8c0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
e8d0: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
e8e0: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
e8f0: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
e900: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
e910: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
e920: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
e930: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
e940: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
e950: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
e960: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
e970: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
e980: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
e990: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
e9a0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e9b0: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
e9c0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
e9d0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e9e0: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
e9f0: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
ea00: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
ea10: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
ea20: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
ea30: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
ea40: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
ea50: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
ea60: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
ea70: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
ea80: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
ea90: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
eaa0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
eab0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
eac0: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
ead0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
eae0: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
eaf0: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
eb00: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
eb10: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
eb20: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
eb30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
eb40: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
eb50: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
eb60: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
eb70: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
eb80: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
eb90: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
eba0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ebb0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
ebc0: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
ebd0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
ebe0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
ebf0: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
ec00: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
ec10: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
ec20: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
ec30: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
ec40: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
ec50: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
ec60: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
ec70: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
ec80: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
ec90: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
eca0: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
ecb0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ecc0: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
ecd0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
ece0: 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  ash initializer 
ecf0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
ed00: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
ed10: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ed20: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
ed30: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
ed40: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ed50: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ed60: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
ed70: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
ed80: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
ed90: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
eda0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
edb0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
edc0: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
edd0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
ede0: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
edf0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
ee00: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
ee10: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
ee20: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
ee30: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
ee40: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
ee50: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
ee60: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
ee70: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ee80: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ee90: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
eea0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
eeb0: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
eec0: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
eed0: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
eee0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
eef0: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
ef00: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
ef10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
ef20: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
ef30: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
ef40: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
ef50: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
ef60: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
ef70: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
ef80: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
ef90: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
efa0: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
efb0: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
efc0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
efd0: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
efe0: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
eff0: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
f000: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
f010: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
f020: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
f030: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
f040: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
f050: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
f060: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
f070: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
f080: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
f090: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
f0a0: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
f0b0: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
f0c0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
f0d0: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
f0e0: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
f0f0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
f100: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
f110: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
f120: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
f130: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
f140: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
f150: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
f160: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
f170: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
f180: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
f190: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
f1a0: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
f1b0: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
f1c0: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
f1d0: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
f1e0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
f1f0: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
f200: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
f210: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
f220: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
f230: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
f240: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
f250: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
f260: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
f270: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
f280: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
f290: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
f2a0: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
f2b0: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
f2c0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
f2d0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
f2e0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
f2f0: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
f300: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
f310: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
f320: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
f330: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
f340: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
f350: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
f360: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
f370: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
f380: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
f390: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
f3a0: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
f3b0: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
f3c0: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
f3d0: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
f3e0: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
f3f0: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
f400: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
f410: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
f420: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
f430: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
f440: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
f450: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
f460: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
f470: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
f480: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f490: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f4a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
f4b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f4c0: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
f4d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
f4e0: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
f4f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f500: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
f510: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f520: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
f530: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
f540: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
f550: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
f560: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
f570: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
f580: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f590: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
f5a0: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
f5b0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
f5c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
f5d0: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
f5e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
f5f0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
f600: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
f610: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
f620: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
f630: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
f640: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
f650: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
f660: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
f670: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
f680: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
f690: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
f6a0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
f6b0: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
f6c0: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
f6d0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
f6e0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
f6f0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
f700: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
f710: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
f720: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f730: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
f740: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
f750: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
f760: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
f770: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
f780: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f790: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
f7a0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
f7b0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
f7c0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
f7d0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
f7e0: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
f7f0: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
f800: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
f810: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f820: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
f830: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f840: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
f850: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f860: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f870: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
f880: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
f890: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f8a0: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
f8b0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
f8c0: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
f8d0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
f8e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f8f0: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
f900: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f910: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f930: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
f940: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
f950: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
f960: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
f970: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f980: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
f990: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
f9a0: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
f9b0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f9d0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
f9e0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
f9f0: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
fa00: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
fa10: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
fa20: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
fa30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fa40: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
fa50: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
fa60: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
fa70: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
fa80: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
fa90: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
faa0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
fab0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
fac0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
fad0: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
fae0: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
faf0: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
fb00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
fb10: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
fb20: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
fb30: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
fb40: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
fb50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
fb60: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
fb70: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
fb80: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
fb90: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
fba0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fbb0: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
fbc0: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
fbd0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
fbe0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
fbf0: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
fc00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fc10: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
fc20: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
fc30: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
fc40: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
fc50: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
fc60: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
fc70: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
fc80: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
fc90: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
fca0: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
fcb0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
fcc0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
fcd0: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
fce0: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
fcf0: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
fd00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
fd10: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
fd20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
fd30: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
fd40: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
fd50: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
fd60: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
fd70: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
fd80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
fd90: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fda0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
fdb0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
fdc0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
fdd0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
fde0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fdf0: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
fe00: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
fe10: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
fe20: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
fe30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
fe40: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
fe50: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
fe60: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
fe70: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
fe80: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
fe90: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
fea0: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
feb0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
fec0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
fed0: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
fee0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fef0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
ff00: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
ff10: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
ff20: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
ff30: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
ff40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
ff50: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
ff60: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
ff70: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
ff80: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
ff90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
ffa0: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
ffb0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
ffc0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
ffd0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
ffe0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
fff0: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
10000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10010 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
10020 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
10030 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
10040 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
10050 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
10060 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
10070 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
10080 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
10090 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
100a0 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
100b0 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
100c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
100d0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
100e0 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
100f0 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
10100 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
10110 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
10120 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
10130 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10140 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
10150 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
10160 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
10170 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10180 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
10190 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
101a0 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
101b0 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
101c0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
101d0 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
101e0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
101f0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
10200 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
10210 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
10220 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
10230 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
10240 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
10250 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
10260 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
10270 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
10280 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
10290 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
102a0 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
102b0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
102c0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
102d0 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
102e0 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
102f0 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
10300 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
10310 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
10320 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
10330 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
10340 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
10350 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
10360 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10370 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
10380 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
10390 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
103a0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
103b0 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
103e0 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
103f0 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
10400 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
10410 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
10420 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
10430 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
10440 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
10450 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
10460 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
10470 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
10480 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
10490 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
104a0 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
104b0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
104c0 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
104d0 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
104e0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
104f0 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
10500 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
10510 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
10520 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
10530 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
10540 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
10550 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
10560 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
10570 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
10580 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
10590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
105a0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
105b0 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
105c0 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
105d0 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
105e0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
105f0 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
10600 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
10610 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
10620 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
10630 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
10640 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10650 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
10660 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10670 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
10680 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
10690 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
106a0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
106b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
106c0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
106d0 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
106e0 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
106f0 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10700 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10710 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10720 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10730 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10740 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10750 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10760 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10770 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10780 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
10790 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
107a0 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
107b0 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
107c0 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
107d0 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
107e0 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
107f0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10800 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10810 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10820 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10830 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10840 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10850 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10860 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10870 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10880 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
10890 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
108a0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
108b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
108c0 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
108d0 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
108e0 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
108f0 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10900 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10910 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10920 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10930 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10940 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10950 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10960 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10970 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10980 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
10990 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
109a0 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
109b0 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
109c0 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
109d0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
109e0 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
109f0 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10a00 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10a10 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10a20 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10a30 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10a40 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10a50 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10a60 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10a70 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10a80 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
10a90 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
10aa0 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
10ab0 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
10ac0 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
10ad0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10ae0 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10af0 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10b00 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10b10 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10b20 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10b30 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10b40 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10b50 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10b60 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10b70 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10b80 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
10b90 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
10ba0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
10bb0 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
10bc0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
10bd0 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
10be0 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
10bf0 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10c00 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10c10 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10c40 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10c50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10c60 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
10c70 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10c80 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
10c90 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
10ca0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10cb0 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
10cc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
10cd0 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
10d00 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
10d10 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
10d20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10d30 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
10d40 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
10d50 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
10d60 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
10d70 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
10d80 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
10d90 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
10da0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
10db0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
10dc0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
10dd0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
10de0 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65  RY .   || !isOpe
10df0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20  n(pPager->jfd). 
10e00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10e10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10e20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10e30 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
10e40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10e50 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
10e60 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
10e70 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
10e80 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
10e90 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
10ea0 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10eb0 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10ec0 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10ed0 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10ee0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10ef0 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
10f00 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
10f10 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
10f20 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
10f30 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
10f40 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
10f50 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10f60 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10f70 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10f80 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10f90 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10fa0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10fb0 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10fc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10fd0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10fe0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10ff0 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
11000 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
11010 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
11020 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
11030 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
11040 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
11050 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
11060 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
11070 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
11080 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
11090 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
110a0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
110b0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
110c0 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
110d0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
110e0 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
110f0 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
11100 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
11110 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
11120 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
11130 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
11140 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
11150 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
11160 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
11170 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
11180 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
11190 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
111a0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
111b0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
111c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
111d0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
111e0 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
111f0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
11200 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
11210 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
11220 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20 20  lMagic, 8,.     
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64 72              iHdr
11250 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29  Off+4+nMaster+8)
11260 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
11270 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
11280 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11290 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b  += (nMaster+20);
112a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
112b0 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
112c0 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
112d0 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
112e0 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
112f0 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
11300 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
11310 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
11320 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
11330 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
11340 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
11350 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
11360 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
11370 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
11380 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
11390 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
113a0 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
113b0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
113c0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
113d0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
113e0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
113f0 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
11400 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
11410 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
11420 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
11430 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
11440 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
11450 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
11460 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
11470 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
11480 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53  e..  */ .  if( S
11490 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
114a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
114b0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
114c0 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26  jrnlSize)).   &&
114d0 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72   jrnlSize>pPager
114e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29  ->journalOff.  )
114f0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
11500 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
11510 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
11520 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
11530 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11540 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
11550 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
11560 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
11570 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
11580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11590 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
115a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
115b0 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
115c0 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  ion++;.  sqlite3
115d0 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
115e0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
115f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
11600 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
11610 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
11620 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67 65  Return the pPage
11630 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 20  r->iDataVersion 
11640 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71 6c  value.*/.u32 sql
11650 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65 72  ite3PagerDataVer
11660 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  sion(Pager *pPag
11670 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
11680 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
11690 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72 65  GER_OPEN );.  re
116a0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61  turn pPager->iDa
116b0 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a  taVersion;.}../*
116c0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72  .** Free all str
116d0 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50  uctures in the P
116e0 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b  ager.aSavepoint[
116f0 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20  ] array and set 
11700 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53  both.** Pager.aS
11710 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67  avepoint and Pag
11720 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f  er.nSavepoint to
11730 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65   zero. Close the
11740 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
11750 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e  if it is open an
11760 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  d the pager is n
11770 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
11780 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mode..*/.static 
11790 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53  void releaseAllS
117a0 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20  avepoints(Pager 
117b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
117c0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
117d0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
117e0 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
117f0 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  h Pager.aSavepoi
11800 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  nt */.  for(ii=0
11810 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11820 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11830 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
11840 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
11850 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
11860 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
11870 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
11880 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
11890 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  || sqlite3IsMemJ
118a0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73  ournal(pPager->s
118b0 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  jfd) ){.    sqli
118c0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
118d0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  r->sjfd);.  }.  
118e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
118f0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29  ger->aSavepoint)
11900 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76  ;.  pPager->aSav
11910 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11920 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
11930 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11940 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a  nSubRec = 0;.}..
11950 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69  /*.** Set the bi
11960 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  t number pgno in
11970 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
11980 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
11990 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20   .** bitvecs of 
119a0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
119b0 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  nts. Return SQLI
119c0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
119d0 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ful.** or SQLITE
119e0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
119f0 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
11a00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
11a10 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
11a20 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50  itvecs(Pager *pP
11a30 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
11a40 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11a60 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
11a70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11a80 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20  TE_OK;       /* 
11a90 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
11aa0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11ab0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11ac0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61  t; ii++){.    Pa
11ad0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
11ae0 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
11af0 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69  point[ii];.    i
11b00 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69  f( pgno<=p->nOri
11b10 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d  g ){.      rc |=
11b20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
11b30 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
11b40 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t, pgno);.      
11b50 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
11b60 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11b70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
11b80 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
11b90 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
11ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11bb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11bc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
11bd0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
11be0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
11bf0 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
11c00 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52  not.** in the ER
11c10 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
11c20 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65  wise, it switche
11c30 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50  s the pager to P
11c40 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61  AGER_OPEN.** sta
11c50 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  te..**.** If the
11c60 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
11c70 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
11c80 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61  s mode, the data
11c90 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20  base file is.** 
11ca0 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63  completely unloc
11cb0 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65  ked. If the file
11cc0 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64   is unlocked and
11cd0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
11ce0 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68   does.** not exh
11cf0 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54  ibit the UNDELET
11d00 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70  ABLE_WHEN_OPEN p
11d10 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75  roperty, the jou
11d20 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
11d30 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73  closed (if it is
11d40 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66   open)..**.** If
11d50 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11d60 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
11d70 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
11d80 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a  is called, the .
11d90 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
11da0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61  he pager cache a
11db0 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66  re discarded bef
11dc0 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61  ore switching ba
11dd0 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50  ck to .** the OP
11de0 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64  EN state. Regard
11df0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
11e00 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11e10 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a  exclusive-mode.*
11e20 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f  * or not, any jo
11e30 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20  urnal file left 
11e40 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
11e50 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74  em will be treat
11e60 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a  ed.** as a hot-j
11e70 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65  ournal and rolle
11e80 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20  d back the next 
11e90 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e  time a read-tran
11ea0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70  saction.** is op
11eb0 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72  ened (by this or
11ec0 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   by any other co
11ed0 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74  nnection)..*/.st
11ee0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
11ef0 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
11f00 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74  ager){..  assert
11f10 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
11f20 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
11f30 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
11f40 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11f50 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20  OPEN .       || 
11f60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11f70 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29  PAGER_ERROR .  )
11f80 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ;..  sqlite3Bitv
11f90 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
11fa0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
11fb0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
11fc0 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nal = 0;.  relea
11fd0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11fe0 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
11ff0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
12000 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
12010 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
12020 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73  r->jfd) );.    s
12030 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
12040 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
12050 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70  er->pWal);.    p
12060 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12070 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65  PAGER_OPEN;.  }e
12080 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
12090 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
120a0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
120d0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61  e returned by pa
120e0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f  gerUnlockDb() */
120f0 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69  .    int iDc = i
12100 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
12110 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  )?sqlite3OsDevic
12120 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
12130 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a  (pPager->fd):0;.
12140 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
12150 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
12160 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e  support deletion
12170 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20   of open files, 
12180 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73  then.    ** clos
12190 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
121a0 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
121b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
121c0 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20  ck.  Otherwise. 
121d0 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f     ** another co
121e0 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
121f0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
12200 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74  e might delete t
12210 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f  he file.    ** o
12220 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
12230 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
12240 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12250 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20  NALMODE_MEMORY  
12260 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12270 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12280 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
12290 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
122a0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
122b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
122c0 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  L      & 5)!=1 )
122d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
122e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
122f0 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d  _DELETE   & 5)!=
12300 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12310 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12320 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35  ODE_TRUNCATE & 5
12330 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
12340 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12350 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
12360 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69  & 5)==1 );.    i
12370 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c  f( 0==(iDc & SQL
12380 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
12390 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29  TABLE_WHEN_OPEN)
123a0 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61  .     || 1!=(pPa
123b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
123c0 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20   & 5).    ){.   
123d0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
123e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
123f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12400 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12410 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12420 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f   and the call to
12430 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
12440 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
12450 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20   fails, set the 
12460 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20  current lock to 
12470 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
12480 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20  e the comment.  
12490 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23    ** above the #
124a0 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f  define for UNKNO
124b0 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
124c0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68  xplanation of wh
124d0 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  y this.    ** is
124e0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
124f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
12500 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
12510 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
12520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12530 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  K && pPager->eSt
12540 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
12550 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12560 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57  ->eLock = UNKNOW
12570 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  N_LOCK;.    }.. 
12580 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
12590 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61  state may be cha
125a0 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f  nged from PAGER_
125b0 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f  ERROR to PAGER_O
125c0 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20  PEN here.    ** 
125d0 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67  without clearing
125e0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e   the error code.
125f0 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69   This is intenti
12600 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72  onal - the error
12610 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20  .    ** code is 
12620 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20  cleared and the 
12630 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74  cache reset in t
12640 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a  he block below..
12650 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12660 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12670 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  de || pPager->eS
12680 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
12690 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  R );.    pPager-
126a0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
126b0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
126c0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
126d0 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OPEN;.  }..  /*
126e0 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
126f0 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
12700 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12710 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
12720 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64   be.  ** trusted
12730 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65  . Now that there
12740 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
12750 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
12760 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a  o the pager,.  *
12770 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20  * it can safely 
12780 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47  move back to PAG
12790 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54  ER_OPEN state. T
127a0 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62  his happens in b
127b0 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  oth.  ** normal 
127c0 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f  and exclusive-lo
127d0 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f  cking mode..  */
127e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
127f0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61 73  rrCode ){.    as
12800 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
12810 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
12820 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
12830 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
12840 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
12850 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50 61  empFile;.    pPa
12860 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12870 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50  GER_OPEN;.    pP
12880 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
12890 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
128a0 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
128b0 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
128c0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
128d0 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  d, 0, 0);.  }.. 
128e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
128f0 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
12900 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
12910 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
12920 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f  Master = 0;.}../
12930 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12940 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
12950 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f  never an IOERR o
12960 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61  r FULL error tha
12970 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68  t requires.** th
12980 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73  e pager to trans
12990 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45  ition into the E
129a0 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61  RROR state may a
129b0 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  hve occurred..**
129c0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
129d0 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
129e0 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
129f0 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
12a00 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ond .** the erro
12a10 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
12a20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
12a30 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
12a40 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c  ion. The .** val
12a50 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
12a60 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
12a70 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
12a80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
12a90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
12aa0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
12ab0 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c  SQLITE_FULL, SQL
12ac0 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65  ITE_IOERR or one
12ad0 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52   of the.** IOERR
12ae0 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20   sub-codes, the 
12af0 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
12b00 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64   ERROR state and
12b10 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
12b20 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
12b30 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57  Pager.errCode. W
12b40 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72  hile the pager r
12b50 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52  emains in the ER
12b60 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c  ROR state,.** al
12b70 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c  l major API call
12b80 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77  s on the Pager w
12b90 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
12ba0 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72  return Pager.err
12bb0 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Code..**.** The 
12bc0 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69  ERROR state indi
12bd0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
12be0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12bf0 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
12c00 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
12c10 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
12c20 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
12c30 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
12c40 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
12c50 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12c60 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
12c70 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
12c80 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
12c90 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
12ca0 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  or occurred, the
12cb0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
12cc0 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
12cd0 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
12ce0 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
12cf0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12d00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
12d10 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65  as if.** it were
12d20 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
12d30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12d40 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
12d50 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
12d60 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
12d70 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
12d80 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
12d90 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  K || !MEMDB );. 
12da0 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20   assert(.       
12db0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
12dc0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
12dd0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
12de0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
12df0 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61  K ||.       (pPa
12e00 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30  ger->errCode & 0
12e10 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
12e20 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  RR.  );.  if( rc
12e30 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
12e40 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f  | rc2==SQLITE_IO
12e50 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ERR ){.    pPage
12e60 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
12e70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12e80 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f  ate = PAGER_ERRO
12e90 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
12ea0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
12eb0 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
12ec0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12ed0 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a  Pgno nPage);../*
12ee0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12ef0 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
12f00 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
12f10 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
12f20 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
12f30 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
12f40 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
12f50 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
12f60 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
12f70 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
12f80 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
12f90 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
12fa0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
12fb0 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
12fc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
12fd0 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
12fe0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
12ff0 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
13000 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
13010 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  n..** .** This r
13020 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
13030 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f  called in PAGER_
13040 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20  ERROR state. If 
13050 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  it is called.** 
13060 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72  in PAGER_NONE or
13070 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
13080 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ate and the lock
13090 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a   held is less.**
130a0 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20   exclusive than 
130b0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  a RESERVED lock,
130c0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
130d0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
130e0 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
130f0 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
13100 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
13110 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13120 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
13130 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
13140 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
13150 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
13160 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
13170 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
13180 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
13190 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
131a0 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
131b0 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
131c0 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
131d0 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
131e0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
131f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13200 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
13210 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13220 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
13230 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
13240 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
13250 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
13260 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
13270 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
13280 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
13290 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
132a0 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
132b0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
132c0 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
132d0 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
132e0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
132f0 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
13300 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
13310 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
13320 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
13330 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
13340 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
13350 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
13360 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
13370 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
13380 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13390 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
133a0 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
133b0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
133c0 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
133d0 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
133e0 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
133f0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
13400 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
13410 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
13420 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
13430 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
13440 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
13450 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
13460 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
13470 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
13480 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
13490 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
134a0 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
134b0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
134c0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
134d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
134e0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
134f0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
13500 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
13510 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
13520 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
13530 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
13540 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
13550 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
13560 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
13570 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
13580 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
13590 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
135a0 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
135b0 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
135c0 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
135d0 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
135e0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
135f0 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
13600 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  ized, the pager 
13610 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52  moves to PAGER_R
13620 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20  EADER state..** 
13630 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  If running in no
13640 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c  n-exclusive roll
13650 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c  back mode, the l
13660 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
13670 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65  is .** downgrade
13680 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f  d to a SHARED_LO
13690 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
136a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
136b0 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
136c0 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
136d0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a  occurs during.**
136e0 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f   any of the IO o
136f0 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e  perations to fin
13700 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
13710 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b  l file or unlock
13720 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
13730 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
13740 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
13750 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
13760 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72   If the .** oper
13770 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a  ation to finaliz
13780 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13790 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  le fails, then t
137a0 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a  he code still.**
137b0 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b   tries to unlock
137c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
137d0 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63  le if not in exc
137e0 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20  lusive mode. If 
137f0 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70  the.** unlock op
13800 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73  eration fails as
13810 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   well, then the 
13820 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65  first error code
13830 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74   related.** to t
13840 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65  he first error e
13850 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20  ncountered (the 
13860 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
13870 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20  tion one) is.** 
13880 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
13890 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
138a0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
138b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
138c0 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20   hasMaster, int 
138d0 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20  bCommit){.  int 
138e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
138f0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
13900 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
13910 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
13920 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
13930 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
13940 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
13950 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
13960 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
13970 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
13980 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
13990 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
139a0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
139b0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
139c0 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
139d0 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
139e0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
139f0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
13a00 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
13a10 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
13a20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
13a30 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
13a40 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
13a50 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
13a60 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
13a70 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
13a80 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
13a90 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
13aa0 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
13ab0 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
13ac0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
13ad0 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
13ae0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
13af0 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
13b00 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
13b10 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
13b20 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
13b30 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
13b40 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
13b50 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
13b60 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
13b70 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
13b80 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
13b90 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13ba0 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
13bb0 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
13bc0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
13bd0 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
13be0 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
13bf0 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
13c00 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
13c10 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
13c20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
13c30 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
13c40 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
13c50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
13c60 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
13c70 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
13c80 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
13c90 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
13ca0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
13cb0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
13cc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13cd0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
13ce0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
13cf0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
13d00 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
13d10 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
13d20 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
13d30 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
13d40 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
13d50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
13d60 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
13d70 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
13d80 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13d90 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
13da0 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d  if( sqlite3IsMem
13db0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
13dc0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
13dd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13de0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13df0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
13e00 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ORY );.      sql
13e10 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
13e20 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
13e30 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13e40 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13e50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
13e60 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
13e70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13e80 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
13e90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13ea0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
13eb0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13ec0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
13ed0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
13ee0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13ef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13f00 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
13f10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
13f20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
13f30 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  ew file size is 
13f40 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
13f50 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77 61   inode right awa
13f60 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  y..          ** 
13f70 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6a 6f  Otherwise the jo
13f80 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73 75  urnal might resu
13f90 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20  rrect following 
13fa0 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64  a power loss and
13fb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
13fc0 75 73 65 20 74 68 65 20 6c 61 73 74 20 74 72 61  use the last tra
13fd0 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c  nsaction to roll
13fe0 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20 20   back.  See.    
13ff0 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f        ** https:/
14000 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c  /bugzilla.mozill
14010 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63  a.org/show_bug.c
14020 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20 20  gi?id=1072773.  
14030 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14040 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14050 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
14060 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
14070 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
14080 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14090 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
140a0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
140b0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
140c0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
140d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
140e0 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
140f0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14100 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
14110 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
14120 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14130 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
14140 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
14150 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
14160 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
14170 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14180 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
14190 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
141a0 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
141b0 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
141c0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
141d0 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
141e0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
141f0 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
14200 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
14210 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
14220 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
14230 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
14240 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
14250 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
14260 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
14270 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
14280 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
14290 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
142a0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a  emory journal. .
142b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
142c0 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 28 21 70  nt bDelete = (!p
142d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
142e0 26 26 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  && sqlite3Journa
142f0 6c 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  lExists(pPager->
14300 6a 66 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73  jfd));.      ass
14310 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
14320 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14330 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
14340 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  TE .           |
14350 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
14360 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14370 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
14380 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
14390 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
143a0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
143b0 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
143c0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
143d0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
143e0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
143f0 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20   bDelete ){.    
14400 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14410 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
14420 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
14430 4a 6f 75 72 6e 61 6c 2c 20 0a 20 20 20 20 20 20  Journal, .      
14440 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
14450 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 53  r->fullSync && S
14460 51 4c 49 54 45 5f 45 58 54 52 41 5f 44 55 52 41  QLITE_EXTRA_DURA
14470 42 4c 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BLE);.      }.  
14480 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
14490 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
144a0 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ES.  sqlite3Pcac
144b0 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
144c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
144d0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
144e0 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  sh);.  if( pPage
144f0 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20  r->dbSize==0 && 
14500 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
14510 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
14520 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
14530 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74  PgHdr *p = sqlit
14540 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
14550 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  ager, 1);.    if
14560 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ( p ){.      p->
14570 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20  pageHash = 0;.  
14580 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14590 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b  UnrefNotNull(p);
145a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
145b0 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  f..  sqlite3Bitv
145c0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
145d0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
145e0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
145f0 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  nal = 0;.  pPage
14600 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73  r->nRec = 0;.  s
14610 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
14620 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
14630 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  ache);.  sqlite3
14640 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
14650 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
14660 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
14670 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
14680 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
14690 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57     /* Drop the W
146a0 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69  AL write-lock, i
146b0 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20  f any. Also, if 
146c0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
146d0 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f  as in .    ** lo
146e0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
146f0 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73  sive mode but is
14700 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70   no longer, drop
14710 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a   the EXCLUSIVE .
14720 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64      ** lock held
14730 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
14740 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
14750 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57    rc2 = sqlite3W
14760 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61  alEndWriteTransa
14770 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
14780 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  al);.    assert(
14790 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
147a0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  );.  }else if( r
147b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
147c0 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65  bCommit && pPage
147d0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50  r->dbFileSize>pP
147e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
147f0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
14800 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
14810 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
14820 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c  ansaction in rol
14830 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20  lback-journal.  
14840 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65    ** mode if the
14850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
14860 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72  n disk is larger
14870 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
14880 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
14890 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
148a0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
148b0 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e  een finalized an
148c0 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
148d0 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73  n .    ** succes
148e0 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64  sfully committed
148f0 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53  , but the EXCLUS
14900 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c  IVE lock is stil
14910 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  l held on the.  
14920 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74    ** file. So it
14930 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e   is safe to trun
14940 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
14950 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69  e file to its mi
14960 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71  nimum.    ** req
14970 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a  uired size.  */.
14980 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14990 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
149a0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
149b0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
149c0 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
149d0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
149e0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
149f0 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69  ITE_OK && bCommi
14a00 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  t && isOpen(pPag
14a10 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72  er->fd) ){.    r
14a20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
14a30 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
14a40 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
14a50 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57  L_COMMIT_PHASETW
14a60 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  O, 0);.    if( r
14a70 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
14a80 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
14a90 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
14aa0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
14ab0 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21  veMode .   && (!
14ac0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
14ad0 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61  er) || sqlite3Wa
14ae0 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
14af0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29  Pager->pWal, 0))
14b00 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  .  ){.    rc2 = 
14b10 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
14b20 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
14b30 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
14b40 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
14b50 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
14b60 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
14b70 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67  R_READER;.  pPag
14b80 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
14b90 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  0;..  return (rc
14ba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
14bb0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  rc);.}../*.** Ex
14bc0 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
14bd0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
14be0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
14bf0 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
14c00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a  atabase file. .*
14c10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14c20 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
14c30 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
14c40 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74  state, do not at
14c50 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f  tempt .** the ro
14c60 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74  llback at this t
14c70 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61  ime. Instead, pa
14c80 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
14c90 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63  called. The.** c
14ca0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
14cb0 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61  ock() will disca
14cc0 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  rd all in-memory
14cd0 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a   pages, unlock.*
14ce0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
14cf0 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ile and move the
14d00 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f   pager back to O
14d10 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68  PEN state. If th
14d20 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  is .** means tha
14d30 74 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  t there is a hot
14d40 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e  -journal left in
14d50 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
14d60 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63  , the next .** c
14d70 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74  onnection to obt
14d80 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
14d90 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28  k on the pager (
14da0 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69  which may be thi
14db0 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20  s one) .** will 
14dc0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
14dd0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
14de0 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
14df0 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
14e00 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e  OR state, but an
14e10 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63   IO or.** malloc
14e20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
14e30 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
14e40 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20   then this will 
14e50 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a  itself cause .**
14e60 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
14e70 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74  ter the ERROR st
14e80 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20  ate. Which will 
14e90 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  be cleared by th
14ea0 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
14eb0 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20  er_unlock(), as 
14ec0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
14ed0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14ee0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
14ef0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
14f00 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
14f10 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
14f20 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67  ER_ERROR && pPag
14f30 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
14f40 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73  R_OPEN ){.    as
14f50 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
14f60 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
14f70 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
14f80 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
14f90 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
14fa0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14fb0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
14fc0 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  c();.      sqlit
14fd0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
14fe0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73  pPager);.      s
14ff0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
15000 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c  alloc();.    }el
15010 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
15020 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
15030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15040 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
15050 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
15060 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74       pager_end_t
15070 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
15080 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  r, 0, 0);.    }.
15090 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
150a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
150b0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
150c0 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
150d0 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
150e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
150f0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
15100 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
15110 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
15120 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
15130 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
15140 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
15150 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
15160 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
15170 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
15180 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
15190 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
151a0 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
151b0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
151c0 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
151d0 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
151e0 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
151f0 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
15200 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
15210 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
15220 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
15230 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
15240 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
15250 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
15260 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
15270 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
15280 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
15290 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
152a0 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
152b0 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
152c0 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
152d0 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
152e0 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
152f0 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
15300 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
15310 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
15320 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
15330 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
15340 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
15350 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
15360 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
15370 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
15380 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
15390 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
153a0 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
153b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
153c0 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
153d0 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
153e0 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
153f0 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
15400 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
15410 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
15420 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
15430 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
15440 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
15450 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
15460 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
15470 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
15480 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
15490 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
154a0 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
154b0 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
154c0 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
154d0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
154e0 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
154f0 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
15500 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15510 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
15520 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
15530 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
15540 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
15550 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
15560 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  m;.}../*.** Repo
15570 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
15580 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
15590 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
155a0 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
155b0 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
155c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
155d0 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
155e0 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
155f0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
15600 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15610 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
15620 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
15630 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
15640 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
15650 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15670 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
15680 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15690 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
156a0 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
156b0 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
156c0 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
156d0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
156e0 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
156f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
15700 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61  S_CODEC./*.** Ma
15710 6b 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62  ke sure the numb
15720 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
15730 69 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 20  its is the same 
15740 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  in the destinati
15750 6f 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69  on.** pager as i
15760 74 20 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72  t is in the sour
15770 63 65 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20  ce.  This comes 
15780 75 70 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d  up when a VACUUM
15790 20 63 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20   changes the.** 
157a0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
157b0 65 64 20 62 69 74 73 20 74 6f 20 74 68 65 20 22  ed bits to the "
157c0 6f 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e  optimal" amount.
157d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
157e0 50 61 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76  PagerAlignReserv
157f0 65 28 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20  e(Pager *pDest, 
15800 50 61 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20  Pager *pSrc){.  
15810 69 66 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65  if( pDest->nRese
15820 72 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65  rve!=pSrc->nRese
15830 72 76 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74  rve ){.    pDest
15840 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72  ->nReserve = pSr
15850 63 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  c->nReserve;.   
15860 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
15870 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  (pDest);.  }.}.#
15880 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
15890 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
158a0 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
158b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
158c0 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
158d0 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
158e0 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
158f0 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
15900 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
15910 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
15920 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
15930 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
15940 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
15950 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
15960 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
15970 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
15980 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
15990 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
159a0 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
159b0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
159c0 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
159d0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
159e0 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
159f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
15a00 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
15a10 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
15a20 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
15a30 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
15a40 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
15a50 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15a60 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
15a70 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
15a80 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
15a90 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
15aa0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
15ab0 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
15ac0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
15ad0 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
15ae0 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
15af0 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
15b00 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
15b10 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
15b20 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
15b30 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
15b40 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
15b50 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
15b60 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
15b70 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
15b80 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
15b90 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
15ba0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
15bb0 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
15bc0 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
15bd0 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
15be0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
15bf0 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
15c00 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
15c10 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
15c20 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
15c30 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
15c40 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
15c50 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
15c60 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
15c70 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
15c80 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
15c90 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15ca0 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
15cb0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
15cc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15cd0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
15ce0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
15cf0 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
15d00 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
15d10 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
15d20 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
15d30 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
15d40 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
15d50 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
15d60 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
15d70 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
15d80 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
15d90 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
15da0 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
15db0 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
15dc0 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
15dd0 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
15de0 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
15df0 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
15e00 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
15e10 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
15e20 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
15e30 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
15e40 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
15e50 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
15e60 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
15e70 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
15e80 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
15e90 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
15ea0 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
15eb0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
15ec0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
15ed0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15ee0 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
15ef0 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
15f00 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
15f10 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
15f20 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
15f30 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
15f40 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
15f50 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
15f60 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
15f70 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
15f80 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
15f90 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
15fa0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15fc0 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
15fd0 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
15fe0 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16000 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
16010 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
16020 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
16030 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16040 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
16050 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
16060 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
16070 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
16080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
16090 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
160a0 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
160b0 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
160c0 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
160d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
160e0 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
160f0 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
16100 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
16110 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
16120 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
16130 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
16140 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
16150 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
16160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16170 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
16180 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
16190 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
161a0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
161b0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
161c0 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
161d0 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
161e0 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16200 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
16210 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
16220 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
16230 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
16240 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
16250 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
16260 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16270 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
16280 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
16290 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
162a0 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
162b0 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
162c0 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
162d0 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
162e0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
162f0 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
16300 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
16310 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
16320 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
16330 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
16340 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
16350 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
16360 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
16370 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
16380 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
16390 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
163a0 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
163b0 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
163c0 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
163d0 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
163e0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
163f0 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
16400 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
16410 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
16420 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
16430 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
16440 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
16450 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
16460 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
16470 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
16480 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
16490 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
164a0 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
164b0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
164c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
164d0 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
164e0 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
164f0 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
16500 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
16510 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
16520 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
16530 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
16540 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16550 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
16560 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
16570 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
16580 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
16590 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
165a0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
165b0 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
165c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
165d0 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
165e0 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
165f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
16600 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
16610 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
16620 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
16630 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
16640 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
16650 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
16660 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
16670 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16680 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
16690 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
166a0 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
166b0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
166c0 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
166d0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
166e0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
166f0 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
16700 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
16710 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
16720 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
16730 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
16740 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
16750 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
16760 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
16770 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
16780 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
16790 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
167a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
167b0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
167c0 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
167d0 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
167e0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
167f0 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
16800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16810 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
16820 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
16830 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
16840 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
16850 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
16860 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
16870 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
16880 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
16890 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
168a0 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
168b0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
168c0 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
168d0 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
168e0 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
168f0 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
16900 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
16910 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
16920 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
16930 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
16940 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
16950 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
16960 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
16970 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
16980 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
16990 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
169a0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
169b0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
169c0 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
169d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
169e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
169f0 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
16a00 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
16a10 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
16a20 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
16a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16a40 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
16a50 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
16a60 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16a70 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
16a80 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
16a90 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16aa0 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
16ab0 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
16ac0 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
16ad0 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
16ae0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16af0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
16b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16b10 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
16b20 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
16b30 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69  back before duri
16b40 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  ng the current. 
16b50 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68   ** rollback, th
16b60 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  en don't bother 
16b70 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20  to play it back 
16b80 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
16b90 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
16ba0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
16bb0 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
16bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16bd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16be0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79  ..  /* When play
16bf0 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c  ing back page 1,
16c00 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65   restore the nRe
16c10 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20  serve setting.  
16c20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  */.  if( pgno==1
16c30 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73   && pPager->nRes
16c40 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74  erve!=((u8*)aDat
16c50 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50  a)[20] ){.    pP
16c60 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
16c70 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30   ((u8*)aData)[20
16c80 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  ];.    pagerRepo
16c90 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
16ca0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16cb0 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43   pager is in CAC
16cc0 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65  HEMOD state, the
16cd0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
16ce0 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
16cf0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
16d00 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
16d10 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
16d20 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
16d30 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
16d40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16d50 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
16d60 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
16d70 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
16d80 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
16d90 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
16da0 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
16db0 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
16dc0 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
16dd0 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
16de0 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
16df0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
16e00 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
16e10 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
16e20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
16e30 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
16e40 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
16e50 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
16e60 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
16e70 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
16e80 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
16e90 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
16ea0 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
16eb0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
16ec0 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
16ed0 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
16ee0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
16ef0 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
16f00 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52   ** If in WRITER
16f10 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46  _DBMOD, WRITER_F
16f20 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20  INISHED or OPEN 
16f30 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
16f40 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70  pdate the.  ** p
16f50 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
16f60 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20   exists and the 
16f70 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
16f80 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
16f90 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72  ed .  ** not dir
16fa0 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63  ty. Since this c
16fb0 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63  ode is only exec
16fc0 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50  uted in PAGER_OP
16fd0 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a  EN state for.  *
16fe0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
16ff0 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
17000 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
17010 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69  the page-cache i
17020 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20  s empty.  ** if 
17030 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
17040 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a  OPEN state..  **
17050 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
17060 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
17070 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
17080 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
17090 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
170a0 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
170b0 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
170c0 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
170d0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
170e0 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
170f0 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
17100 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
17110 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
17120 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
17130 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
17140 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
17150 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
17160 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
17170 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
17180 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
17190 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
171a0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
171b0 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
171c0 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
171d0 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
171e0 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
171f0 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
17200 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
17210 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
17220 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
17230 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
17240 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
17250 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
17260 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
17270 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
17280 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
17290 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
172a0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
172b0 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
172c0 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
172d0 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
172e0 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
172f0 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
17300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
17310 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
17320 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
17330 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
17340 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
17350 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
17360 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
17370 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
17380 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
17390 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
173a0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
173b0 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
173c0 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
173d0 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
173e0 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
173f0 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
17400 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
17410 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
17420 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
17430 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
17440 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
17450 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
17460 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
17470 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
17480 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
17490 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
174a0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
174b0 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
174c0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  d..  */.  if( pa
174d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
174e0 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  ) ){.    pPg = 0
174f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17500 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
17510 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
17520 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
17530 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
17540 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
17550 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
17560 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
17570 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  g==0 );.  PAGERT
17580 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
17590 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
175a0 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
175b0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
175c0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
175d0 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
175e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
175f0 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
17600 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
17610 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
17620 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
17630 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
17640 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
17650 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
17660 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
17670 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
17680 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
17690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
176a0 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
176b0 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
176c0 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
176d0 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
176e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
176f0 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
17700 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
17710 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
17720 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
17730 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
17740 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
17750 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
17760 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
17770 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
17780 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
17790 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
177a0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
177b0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
177c0 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
177d0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
177e0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
177f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
17800 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
17810 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61  (u8 *)aData, pPa
17820 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
17830 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
17840 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
17850 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
17860 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
17870 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
17880 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17890 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
178a0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
178b0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
178c0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
178d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
178e0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
178f0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
17900 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
17910 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
17920 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17930 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
17940 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
17950 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17960 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
17970 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
17980 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
17990 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
179a0 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
179b0 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
179c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
179d0 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
179e0 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
179f0 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
17a00 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
17a10 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
17a20 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
17a30 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
17a40 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
17a50 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
17a60 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
17a70 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
17a80 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
17a90 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
17aa0 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
17ab0 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
17ac0 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
17ad0 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
17ae0 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
17af0 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
17b00 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
17b10 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
17b20 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
17b30 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
17b40 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
17b50 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
17b60 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
17b70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
17b80 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
17b90 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
17ba0 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
17bb0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
17bc0 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
17bd0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
17be0 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
17bf0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
17c00 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
17c10 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
17c20 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
17c30 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
17c40 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
17c50 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
17c60 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
17c70 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
17c80 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
17c90 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
17ca0 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
17cb0 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
17cc0 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
17cd0 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
17ce0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17cf0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
17d00 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
17d10 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
17d20 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
17d30 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)==0 );.    pPa
17d40 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
17d50 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  |= SPILLFLAG_ROL
17d60 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  LBACK;.    rc = 
17d70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
17d80 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
17d90 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Pg, 1);.    asse
17da0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
17db0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
17dc0 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30  LAG_ROLLBACK)!=0
17dd0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
17de0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53  doNotSpill &= ~S
17df0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
17e00 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  K;.    if( rc!=S
17e10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
17e20 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66  n rc;.    pPg->f
17e30 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
17e40 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71  EED_READ;.    sq
17e50 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
17e60 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20  irty(pPg);.  }. 
17e70 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
17e80 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
17e90 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
17ea0 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
17eb0 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
17ec0 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
17ed0 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
17ee0 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
17ef0 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
17f00 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
17f10 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
17f20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
17f30 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
17f40 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
17f50 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
17f60 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
17f70 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
17f80 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
17f90 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
17fa0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
17fb0 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
17fc0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
17fd0 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d      pData = pPg-
17fe0 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63  >pData;.    memc
17ff0 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61  py(pData, (u8*)a
18000 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
18010 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  geSize);.    pPa
18020 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
18030 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d  Pg);.    if( isM
18040 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53  ainJrnl && (!isS
18050 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73  avepnt || *pOffs
18060 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  et<=pPager->jour
18070 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20  nalHdr) ){.     
18080 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65   /* If the conte
18090 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
180a0 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f   were just resto
180b0 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  red from the mai
180c0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  n .      ** jour
180d0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
180e0 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20  ts content must 
180f0 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20  be as they were 
18100 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  when the .      
18110 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
18120 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
18130 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
18140 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61   can mark the pa
18150 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63  ge.      ** as c
18160 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72  lean, since ther
18170 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65  e will be no nee
18180 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75  d to write it ou
18190 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
181a0 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
181b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
181c0 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
181d0 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
181e0 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
181f0 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
18200 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
18210 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
18220 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
18230 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
18240 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
18250 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
18260 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
18270 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
18280 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
18290 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
182a0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
182b0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
182c0 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
182d0 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
182e0 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
182f0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
18300 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
18310 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
18320 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
18330 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
18340 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
18350 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
18360 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
18370 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
18380 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
18390 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
183a0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
183b0 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
183c0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
183d0 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
183e0 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
183f0 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
18400 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
18410 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
18420 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
18430 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
18440 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
18450 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
18460 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
18470 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
18480 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
18490 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
184a0 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
184b0 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
184c0 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
184d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
184e0 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
184f0 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
18500 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
18510 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
18520 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
18530 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
18540 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pPg);.    }.  
18550 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
18560 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20  hash(pPg);..    
18570 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
18580 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
18590 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
185a0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
185b0 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
185c0 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
185d0 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
185e0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
185f0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
18600 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
18610 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
18620 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
18630 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
18640 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
18650 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
18660 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
18670 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
18680 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
18690 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  ->pgno, 3, rc=SQ
186a0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
186b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
186c0 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
186d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
186e0 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
186f0 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
18700 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
18710 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
18720 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
18730 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
18740 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
18750 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18760 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
18770 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
18780 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
18790 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
187a0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
187b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
187c0 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
187d0 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
187e0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
187f0 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
18800 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
18810 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
18820 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
18830 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
18840 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
18850 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
18860 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
18870 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
18880 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
18890 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
188a0 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
188b0 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
188c0 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
188d0 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
188e0 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
188f0 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
18900 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
18910 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
18920 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
18930 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
18940 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
18950 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
18960 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
18970 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
18980 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
18990 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
189a0 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
189b0 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
189c0 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
189d0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
189e0 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
189f0 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
18a00 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
18a10 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
18a20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
18a30 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
18a40 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
18a50 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
18a60 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
18a70 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
18a80 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
18a90 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
18aa0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
18ab0 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
18ac0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
18ad0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
18ae0 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
18af0 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
18b00 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
18b10 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
18b20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
18b30 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
18b40 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
18b50 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
18b60 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
18b70 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
18b80 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
18b90 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
18ba0 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
18bb0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
18bc0 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
18bd0 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
18be0 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
18bf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
18c00 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
18c10 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
18c20 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
18c30 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
18c40 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
18c50 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
18c60 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
18c70 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
18c80 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
18c90 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
18ca0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
18cb0 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
18cc0 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
18cd0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
18ce0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
18cf0 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
18d00 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
18d10 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
18d20 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
18d30 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
18d40 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
18d50 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
18d60 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
18d70 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
18d80 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
18d90 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
18da0 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
18db0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
18dc0 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
18dd0 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
18de0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
18df0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
18e00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18e10 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
18e20 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
18e30 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
18e40 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
18e50 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
18e60 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
18e70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
18e80 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
18e90 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
18ea0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
18eb0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
18ec0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
18ed0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18ef0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
18f00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
18f10 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
18f20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
18f30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
18f40 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
18f50 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
18f60 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
18f70 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
18f80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18f90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
18fa0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
18fb0 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
18fc0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18fd0 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
18fe0 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
18ff0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
19000 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19010 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
19020 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
19030 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e  /* Pointer to on
19040 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e  e journal within
19050 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   MJ file */.  ch
19060 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20  ar *zMasterPtr; 
19070 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
19080 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65   to hold MJ file
19090 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72  name from a jour
190a0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
190b0 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20  t nMasterPtr;   
190c0 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e          /* Amoun
190d0 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  t of space alloc
190e0 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50  ated to zMasterP
190f0 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tr[] */..  /* Al
19100 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
19110 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
19120 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
19130 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
19140 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
19150 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
19160 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19170 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
19180 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
19190 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
191a0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
191b0 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
191c0 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
191d0 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
191e0 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
191f0 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
19200 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
19210 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
19220 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
19230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
19240 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
19250 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
19260 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
19270 4f 4e 0a 20 20 20 20 20 20 28 70 50 61 67 65 72  ON.      (pPager
19280 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54  ->vfsFlags&SQLIT
19290 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45  E_OPEN_FILEPROTE
192a0 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e  CTION_MASK)|.#en
192b0 64 69 66 0a 20 20 20 20 20 20 28 53 51 4c 49 54  dif.      (SQLIT
192c0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
192d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
192e0 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
192f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
19300 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
19310 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
19320 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
19330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19340 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19350 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  out;..  /* Load 
19360 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
19370 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
19380 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
19390 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c  ed from.  ** sql
193a0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
193b0 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
193c0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
193d0 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20    Also obtain.  
193e0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ** sufficient sp
193f0 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50  ace (in zMasterP
19400 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  tr) to hold the 
19410 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a  names of master.
19420 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
19430 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
19440 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61  m regular rollba
19450 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ck-journals..  *
19460 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
19470 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
19480 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
19490 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
194a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
194b0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
194c0 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70    nMasterPtr = p
194d0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
194e0 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  1;.  zMasterJour
194f0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
19500 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
19510 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20  al + nMasterPtr 
19520 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61  + 1);.  if( !zMa
19530 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
19540 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19550 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64  OMEM;.    goto d
19560 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19570 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d  }.  zMasterPtr =
19580 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &zMasterJournal
19590 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b  [nMasterJournal+
195a0 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  1];.  rc = sqlit
195b0 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
195c0 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
195d0 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  , (int)nMasterJo
195e0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28  urnal, 0);.  if(
195f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19600 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19610 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  out;.  zMasterJo
19620 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
19630 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a  rnal] = 0;..  zJ
19640 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
19650 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65  Journal;.  while
19660 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
19670 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
19680 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
19690 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20    int exists;.  
196a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
196b0 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f  Access(pVfs, zJo
196c0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
196d0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
196e0 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72  ists);.    if( r
196f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19700 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
19710 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
19720 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
19730 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  {.      /* One o
19740 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
19750 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
19760 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19770 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a  exists..      **
19780 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
19790 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
197a0 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
197b0 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
197c0 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
197d0 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
197e0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
197f0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  l file..      */
19800 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  .      int c;.  
19810 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
19820 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
19830 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
19840 4f 4e 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  ON.        (pPag
19850 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c  er->vfsFlags&SQL
19860 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f  ITE_OPEN_FILEPRO
19870 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23  TECTION_MASK)|.#
19880 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 28 53  endif.        (S
19890 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
198a0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
198b0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
198c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
198d0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a  3OsOpen(pVfs, zJ
198e0 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c  ournal, pJournal
198f0 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
19900 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19910 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19920 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19930 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
19940 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
19950 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e  erJournal(pJourn
19960 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20  al, zMasterPtr, 
19970 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
19980 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
19990 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(pJournal);.   
199a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
199b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
199c0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
199d0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
199e0 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
199f0 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d  r[0]!=0 && strcm
19a00 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d  p(zMasterPtr, zM
19a10 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  aster)==0;.     
19a20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
19a30 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
19a40 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
19a50 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
19a60 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
19a70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
19a80 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19a90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a    }.    }.    zJ
19aa0 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
19ab0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
19ac0 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20  nal)+1);.  }. . 
19ad0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19ae0 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d  pMaster);.  rc =
19af0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
19b00 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
19b10 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f  0);..delmaster_o
19b20 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
19b30 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
19b40 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65  l);.  if( pMaste
19b50 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
19b60 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
19b70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ;.    assert( !i
19b80 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20  sOpen(pJournal) 
19b90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19ba0 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
19bb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19bc0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
19bd0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
19be0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74  o change the act
19bf0 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ual size of the 
19c00 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
19c10 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
19c20 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20  stem. This only 
19c30 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d  happens when com
19c40 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
19c50 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c  ction,.** or rol
19c60 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e  ling back a tran
19c70 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69  saction (includi
19c80 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ng rolling back 
19c90 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
19ca0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69  **.** If the mai
19cb0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
19cc0 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
19cd0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
19ce0 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42   in either.** DB
19cf0 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  MOD or OPEN stat
19d00 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
19d10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
19d20 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65  erwise, the size
19d30 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65   .** of the file
19d40 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e   is changed to n
19d50 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67  Page pages (nPag
19d60 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e*pPager->pageSi
19d70 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49  ze bytes). .** I
19d80 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
19d90 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  sk is currently 
19da0 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67  larger than nPag
19db0 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73  e pages, then us
19dc0 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72  e the VFS.** xTr
19dd0 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20  uncate() method 
19de0 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a  to truncate it..
19df0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67  **.** Or, it mig
19e00 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
19e10 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
19e20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
19e30 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
19e40 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
19e50 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
19e60 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
19e70 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
19e80 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
19e90 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
19ea0 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
19eb0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
19ec0 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
19ed0 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
19ee0 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
19ef0 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
19f00 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
19f10 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
19f20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
19f30 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
19f40 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
19f50 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
19f60 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
19f70 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
19f80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
19f90 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
19fa0 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
19fb0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
19fc0 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
19fd0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
19fe0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
19ff0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a000 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
1a010 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
1a020 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
1a030 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a040 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45  eState!=PAGER_RE
1a050 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28  ADER );.  .  if(
1a060 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1a070 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67  fd) .   && (pPag
1a080 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1a090 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
1a0a0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1a0b0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20  ==PAGER_OPEN) . 
1a0c0 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
1a0d0 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
1a0e0 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  ;.    int szPage
1a0f0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
1a100 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
1a110 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
1a120 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
1a130 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  ;.    /* TODO: I
1a140 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65  s it safe to use
1a150 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
1a160 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72  e here? */.    r
1a170 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1a180 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
1a190 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b  , &currentSize);
1a1a0 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73  .    newSize = s
1a1b0 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65  zPage*(i64)nPage
1a1c0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1a1d0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
1a1e0 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
1a1f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
1a200 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
1a210 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a220 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
1a230 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
1a240 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
1a250 65 6c 73 65 20 69 66 28 20 28 63 75 72 72 65 6e  else if( (curren
1a260 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e  tSize+szPage)<=n
1a270 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1a280 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70    char *pTmp = p
1a290 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1a2a0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
1a2b0 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65  (pTmp, 0, szPage
1a2c0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1a2d0 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
1a2e0 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74  Page) == current
1a2f0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
1a300 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
1a310 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75  ze-szPage) >  cu
1a320 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
1a330 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a340 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1a350 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67  >fd, pTmp, szPag
1a360 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  e, newSize-szPag
1a370 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1a380 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a390 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1a3a0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
1a3b0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
1a3c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1a3d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a3e0 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69  ** Return a sani
1a3f0 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  tized version of
1a400 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
1a410 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c   of OS file pFil
1a420 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e  e. The.** return
1a430 20 76 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e   value is guaran
1a440 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77  teed to lie betw
1a450 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53  een 32 and MAX_S
1a460 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69  ECTOR_SIZE..*/.i
1a470 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72  nt sqlite3Sector
1a480 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1a490 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
1a4a0 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f   iRet = sqlite3O
1a4b0 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c  sSectorSize(pFil
1a4c0 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33  e);.  if( iRet<3
1a4d0 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20  2 ){.    iRet = 
1a4e0 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  512;.  }else if(
1a4f0 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52   iRet>MAX_SECTOR
1a500 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73  _SIZE ){.    ass
1a510 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ert( MAX_SECTOR_
1a520 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20  SIZE>=512 );.   
1a530 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54   iRet = MAX_SECT
1a540 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72  OR_SIZE;.  }.  r
1a550 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f  eturn iRet;.}../
1a560 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
1a570 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e  ue of the Pager.
1a580 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1a590 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ble for the give
1a5a0 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64  n.** pager based
1a5b0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65   on the value re
1a5c0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
1a5d0 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64  ectorSize method
1a5e0 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  .** of the open 
1a5f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1a600 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
1a610 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  ill be used .** 
1a620 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1a630 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
1a640 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
1a650 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
1a660 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
1a670 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
1a680 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
1a690 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
1a6a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
1a6b0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1a6c0 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
1a6d0 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
1a6e0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
1a6f0 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
1a700 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
1a710 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a720 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
1a730 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1a740 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
1a750 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
1a760 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
1a770 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
1a780 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
1a790 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
1a7a0 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
1a7b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
1a7c0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a  _SECTOR_SIZE..**
1a7d0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1a7e0 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49  has the SQLITE_I
1a7f0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1a800 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74  VERWRITE propert
1a810 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74  y, then set.** t
1a820 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a830 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20  tor size to its 
1a840 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35  minimum value (5
1a850 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73  12).  The purpos
1a860 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  e of.** pPager->
1a870 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f  sectorSize is to
1a880 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61   define the "bla
1a890 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79  st radius" of by
1a8a0 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  tes that.** migh
1a8b0 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72  t change if a cr
1a8c0 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ash occurs while
1a8d0 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69   writing to a si
1a8e0 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20  ngle byte in.** 
1a8f0 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74  that range.  But
1a900 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f   with POWERSAFE_
1a910 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62  OVERWRITE, the b
1a920 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a  last radius is z
1a930 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20  ero.** (that is 
1a940 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f  what POWERSAFE_O
1a950 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c  VERWRITE means),
1a960 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20   so we minimize 
1a970 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69  the sector.** si
1a980 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72  ze.  For backwar
1a990 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
1a9a0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1a9b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1a9c0 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e  rmat,.** we cann
1a9d0 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66  ot reduce the ef
1a9e0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a9f0 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a  ize below 512..*
1aa00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1aa10 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
1aa20 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
1aa30 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1aa40 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1aa50 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1aa60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
1aa70 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73  empFile.   || (s
1aa80 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1aa90 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1aaa0 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20  ager->fd) & .   
1aab0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1aac0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1aad0 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a  E_OVERWRITE)!=0.
1aae0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74    ){.    /* Sect
1aaf0 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
1ab00 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
1ab10 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
1ab20 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
1ab30 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
1ab40 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
1ab50 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
1ab60 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
1ab70 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
1ab80 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20  l segfault. */. 
1ab90 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1aba0 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
1abb0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
1abc0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
1abd0 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1abe0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1abf0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
1ac00 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
1ac10 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
1ac20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ac30 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
1ac40 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
1ac50 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
1ac60 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
1ac70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
1ac80 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
1ac90 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
1aca0 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
1acb0 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
1acc0 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
1acd0 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
1ace0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1acf0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1ad00 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1ad10 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
1ad20 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
1ad30 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
1ad40 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
1ad50 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
1ad60 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
1ad70 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
1ad80 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
1ad90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
1ada0 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
1adb0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1adc0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1add0 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
1ade0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
1adf0 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
1ae00 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
1ae10 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
1ae20 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1ae30 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
1ae40 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
1ae50 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
1ae60 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
1ae70 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
1ae80 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1ae90 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1aea0 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
1aeb0 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
1aec0 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
1aed0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1aee0 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
1aef0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1af00 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
1af10 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
1af20 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
1af30 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
1af40 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
1af50 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
1af60 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
1af70 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
1af80 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
1af90 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
1afa0 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
1afb0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1afc0 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
1afd0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
1afe0 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
1aff0 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
1b000 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
1b010 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
1b020 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
1b030 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
1b040 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
1b050 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
1b060 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
1b070 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
1b080 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
1b090 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
1b0a0 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
1b0b0 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
1b0c0 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
1b0d0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1b0e0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
1b0f0 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
1b100 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1b110 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
1b120 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
1b130 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1b140 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
1b150 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
1b160 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
1b170 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1b180 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
1b190 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
1b1a0 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
1b1b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1b1c0 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
1b1d0 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
1b1e0 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
1b1f0 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
1b200 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
1b210 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
1b220 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
1b230 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1b240 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
1b250 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
1b260 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
1b270 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
1b280 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
1b290 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
1b2a0 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
1b2b0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1b2c0 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
1b2d0 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
1b2e0 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
1b2f0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
1b300 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
1b310 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
1b320 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
1b330 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
1b340 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
1b350 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
1b360 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
1b370 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
1b380 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
1b390 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
1b3a0 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
1b3b0 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
1b3c0 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
1b3d0 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
1b3e0 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
1b3f0 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
1b400 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
1b410 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1b420 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
1b430 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1b440 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1b450 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1b460 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
1b470 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
1b480 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
1b490 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1b4a0 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
1b4b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1b4c0 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
1b4d0 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
1b4e0 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
1b4f0 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
1b500 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
1b510 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
1b520 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
1b530 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
1b540 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
1b550 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
1b560 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
1b570 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
1b580 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
1b590 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1b5a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1b5b0 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
1b5c0 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1b5d0 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
1b5e0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1b5f0 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
1b600 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
1b610 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
1b620 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
1b630 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
1b640 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
1b650 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
1b660 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
1b670 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1b680 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
1b690 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
1b6a0 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
1b6b0 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
1b6c0 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
1b6d0 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
1b6e0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
1b6f0 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
1b700 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
1b710 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
1b720 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1b730 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
1b740 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
1b750 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1b760 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1b770 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
1b780 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1b790 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1b7a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1b7b0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1b7c0 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1b7d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b7e0 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
1b7f0 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1b800 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
1b810 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1b820 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1b830 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
1b840 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1b850 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
1b860 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
1b870 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
1b880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b890 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1b8a0 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
1b8b0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
1b8c0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1b8d0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1b8e0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
1b8f0 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
1b900 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
1b910 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b920 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1b930 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
1b940 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
1b950 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
1b960 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
1b970 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
1b980 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ge rollback */. 
1b990 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d   int nPlayback =
1b9a0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74   0;       /* Tot
1b9b0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1b9c0 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  es restored from
1b9d0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f   journal */..  /
1b9e0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1b9f0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1ba00 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1ba10 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1ba20 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1ba30 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1ba40 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1ba50 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1ba60 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1ba70 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1ba80 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1ba90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1baa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1bab0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1bac0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1bad0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1bae0 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1baf0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1bb00 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1bb10 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1bb20 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1bb30 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1bb40 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1bb50 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1bb60 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1bb70 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1bb80 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1bb90 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1bba0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1bbb0 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1bbc0 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1bbd0 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1bbe0 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1bbf0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1bc00 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1bc10 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1bc20 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1bc30 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1bc40 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1bc50 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1bc60 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1bc70 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1bc80 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1bc90 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1bca0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1bcb0 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1bcc0 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1bcd0 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1bce0 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1bcf0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1bd00 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1bd10 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1bd20 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1bd30 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1bd40 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1bd50 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1bd60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1bd70 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1bd80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1bd90 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1bda0 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1bdb0 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1bdc0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1bdd0 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1bde0 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1bdf0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1be00 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1be10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1be20 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1be30 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1be40 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1be50 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1be60 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1be70 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1be80 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1be90 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1bea0 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1beb0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1bec0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1bed0 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1bee0 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1bef0 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1bf00 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1bf10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1bf20 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1bf30 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1bf40 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1bf50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1bf60 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1bf70 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1bf80 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1bf90 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1bfa0 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1bfb0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1bfc0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1bfd0 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1bfe0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1bff0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1c000 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1c010 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1c020 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1c030 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1c040 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1c050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1c060 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c070 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1c080 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c090 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1c0a0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c0b0 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1c0c0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1c0d0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1c0e0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1c0f0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1c100 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1c110 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1c120 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1c130 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1c140 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1c150 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1c160 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1c170 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1c180 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1c190 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1c1a0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1c1b0 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1c1c0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1c1d0 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1c1e0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1c1f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c200 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1c210 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c220 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1c230 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1c240 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1c250 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1c260 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1c270 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c280 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1c290 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1c2a0 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1c2b0 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1c2c0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1c2d0 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1c2e0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1c2f0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1c300 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1c310 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1c320 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1c330 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1c340 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1c350 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1c360 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1c370 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1c380 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1c390 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1c3a0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1c3b0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1c3c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1c3d0 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1c3e0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1c3f0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1c400 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1c410 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1c420 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1c430 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1c440 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1c450 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1c460 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1c470 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1c480 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1c490 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1c4a0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1c4b0 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1c4c0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1c4d0 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1c4e0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1c4f0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1c500 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1c510 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1c520 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1c530 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1c540 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1c550 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1c560 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1c570 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1c580 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1c590 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1c5a0 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1c5b0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1c5c0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1c5d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1c5e0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1c5f0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1c600 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1c610 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1c620 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1c630 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c640 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1c650 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1c660 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c670 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1c680 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1c690 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1c6a0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1c6b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1c6c0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1c6d0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1c6e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1c6f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1c700 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1c710 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1c720 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1c730 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1c740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1c750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c760 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1c770 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1c780 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1c790 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1c7a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1c7b0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1c7c0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1c7d0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1c7e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1c7f0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1c800 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1c810 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1c820 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1c830 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1c840 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1c850 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1c860 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1c870 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1c880 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1c890 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1c8a0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1c8b0 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1c8c0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1c8d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1c8e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c8f0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b        nPlayback+
1c900 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
1c910 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1c920 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1c930 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c940 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1c950 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1c960 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1c970 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1c980 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c990 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1c9a0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c9b0 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1c9c0 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1c9d0 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1c9e0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1c9f0 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1ca00 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1ca10 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1ca20 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1ca30 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1ca40 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1ca50 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1ca60 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1ca70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1ca80 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1ca90 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1caa0 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1cab0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1cac0 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1cad0 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1cae0 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1caf0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1cb00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1cb10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1cb20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1cb30 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1cb40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1cb50 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1cb60 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1cb70 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1cb80 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1cb90 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1cba0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1cbb0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1cbc0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1cbd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1cbe0 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1cbf0 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1cc00 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1cc10 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1cc20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1cc30 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1cc40 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1cc50 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1cc60 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1cc70 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1cc80 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1cc90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cca0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1ccb0 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1ccc0 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1ccd0 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1cce0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1ccf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cd00 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1cd10 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1cd20 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1cd30 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1cd40 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1cd50 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1cd60 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1cd70 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1cd80 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1cd90 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1cda0 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1cdb0 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1cdc0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1cdd0 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1cde0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1cdf0 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67  DEBUG.  if( pPag
1ce00 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1ce10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
1ce20 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
1ce30 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
1ce40 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1ce50 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65  ANGED,0);.  }.#e
1ce60 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1ce70 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1ce80 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1ce90 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1cea0 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1ceb0 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1cec0 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1ced0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1cee0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1cef0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1cf00 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1cf10 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1cf20 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1cf30 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1cf40 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1cf50 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1cf60 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1cf70 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1cf80 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1cf90 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1cfa0 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1cfb0 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1cfc0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1cfd0 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1cfe0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1cff0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1d000 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1d010 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1d020 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1d030 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1d040 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1d050 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1d060 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1d070 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1d080 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1d090 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1d0a0 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1d0b0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1d0c0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1d0d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1d0e0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1d0f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1d100 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1d110 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1d120 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1d130 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1d140 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1d150 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1d160 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1d170 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1d180 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1d190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d1a0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1d1b0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1d1c0 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1d1d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1d1e0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1d1f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d200 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c  agerSync(pPager,
1d210 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
1d220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d230 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1d240 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
1d250 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
1d260 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20  ]!='\0', 0);.   
1d270 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1d280 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1d290 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d2a0 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1d2b0 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  ] && res ){.    
1d2c0 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
1d2d0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1d2e0 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
1d2f0 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
1d300 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
1d310 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
1d320 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
1d330 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1d340 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1d350 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
1d360 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
1d370 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
1d380 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d390 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48  );.  }.  if( isH
1d3a0 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20  ot && nPlayback 
1d3b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
1d3c0 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  og(SQLITE_NOTICE
1d3d0 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
1d3e0 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25 64  K, "recovered %d
1d3f0 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c   pages from %s",
1d400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d410 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67   nPlayback, pPag
1d420 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
1d430 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
1d440 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1d450 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
1d460 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
1d470 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
1d480 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
1d490 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1d4a0 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
1d4b0 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
1d4c0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
1d4d0 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
1d4e0 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1d4f0 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
1d500 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
1d510 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1d520 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1d530 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1d540 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
1d550 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
1d560 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
1d570 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
1d580 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
1d590 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
1d5a0 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d5b0 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1d5c0 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
1d5d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
1d5e0 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
1d5f0 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
1d600 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
1d610 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
1d620 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
1d630 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
1d640 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d650 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
1d660 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1d670 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1d680 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1d690 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
1d6a0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1d6b0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1d6c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1d6d0 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
1d6e0 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61 6d 65  *pPg, u32 iFrame
1d6f0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1d700 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1d710 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63  ; /* Pager objec
1d720 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1d730 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20  h page pPg */.  
1d740 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
1d750 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20  >pgno;       /* 
1d760 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72  Page number to r
1d770 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ead */.  int rc 
1d780 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1d790 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d7a0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  code */.  int pg
1d7b0 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  sz = pPager->pag
1d7c0 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72  eSize; /* Number
1d7d0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
1d7e0 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
1d7f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1d800 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
1d810 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
1d820 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1d830 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64  r->fd) );..#ifnd
1d840 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1d850 41 4c 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20  AL.  if( iFrame 
1d860 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  ){.    /* Try to
1d870 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66   pull the page f
1d880 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68  rom the write-ah
1d890 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  ead log. */.    
1d8a0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52  rc = sqlite3WalR
1d8b0 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  eadFrame(pPager-
1d8c0 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70  >pWal, iFrame, p
1d8d0 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  gsz, pPg->pData)
1d8e0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1d8f0 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  .  {.    i64 iOf
1d900 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
1d910 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1d920 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
1d930 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1d940 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
1d950 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66  Data, pgsz, iOff
1d960 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
1d970 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1d980 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1d990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d9a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1d9b0 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1d9c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1d9d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
1d9e0 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
1d9f0 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
1da00 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
1da10 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
1da20 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
1da30 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
1da40 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
1da50 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
1da60 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
1da70 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1da80 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
1da90 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
1daa0 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1dab0 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
1dac0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1dad0 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
1dae0 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
1daf0 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
1db00 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
1db10 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
1db20 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
1db30 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
1db40 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
1db50 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
1db60 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
1db70 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
1db80 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1db90 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
1dba0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
1dbb0 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
1dbc0 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
1dbd0 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
1dbe0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1dbf0 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
1dc00 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
1dc10 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
1dc20 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20 65 71  * white noise eq
1dc30 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20  ualing 16 bytes 
1dc40 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73  of 0xff is vanis
1dc50 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a  hingly small so.
1dc60 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
1dc70 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a  ld still be ok..
1dc80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
1dc90 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62  emset(pPager->db
1dca0 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20  FileVers, 0xff, 
1dcb0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1dcc0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1dcd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
1dce0 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26   *dbFileVers = &
1dcf0 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61  ((u8*)pPg->pData
1dd00 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  )[24];.      mem
1dd10 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1dd20 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1dd30 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  ers, sizeof(pPag
1dd40 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1dd50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f  ;.    }.  }.  CO
1dd60 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67  DEC1(pPager, pPg
1dd70 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  ->pData, pgno, 3
1dd80 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  , rc = SQLITE_NO
1dd90 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  MEM);..  PAGER_I
1dda0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1ddb0 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1ddc0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1ddd0 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1dde0 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1ddf0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1de00 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52   pgno));.  PAGER
1de10 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64  TRACE(("FETCH %d
1de20 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1de30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1de40 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1de50 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
1de60 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1de70 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1de80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  c;.}../*.** Upda
1de90 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
1dea0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1deb0 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34  er at offsets 24
1dec0 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68   and 92 in.** th
1ded0 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  e header and the
1dee0 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20   sqlite version 
1def0 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
1df00 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   96..**.** This 
1df10 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  is an unconditio
1df20 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65  nal update.  See
1df30 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f   also the pager_
1df40 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1df50 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  er().** routine 
1df60 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74  which only updat
1df70 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
1df80 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64  unter if the upd
1df90 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a  ate is actually.
1dfa0 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65  ** needed, as de
1dfb0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
1dfc0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1dfd0 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61  untDone state va
1dfe0 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
1dff0 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69  c void pager_wri
1e000 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1e010 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1e020 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1e030 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  er;..  /* Increm
1e040 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1e050 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1e060 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1e070 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1e080 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
1e090 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
1e0a0 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  )pPg->pPager->db
1e0b0 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70  FileVers)+1;.  p
1e0c0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1e0d0 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c  )pPg->pData)+24,
1e0e0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1e0f0 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f  ;..  /* Also sto
1e100 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
1e110 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
1e120 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
1e130 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39   in.  ** bytes 9
1e140 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20  2..95 store the 
1e150 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66  change counter f
1e160 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72  or which the ver
1e170 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  sion number.  **
1e180 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
1e190 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1e1a0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32  *)pPg->pData)+92
1e1b0 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1e1c0 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  );.  put32bits((
1e1d0 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1e1e0 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45  a)+96, SQLITE_VE
1e1f0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d  RSION_NUMBER);.}
1e200 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e210 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
1e220 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e230 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f   invoked once fo
1e240 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74  r each page that
1e250 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1e260 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  n .** written in
1e270 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  to the log file 
1e280 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73  when a WAL trans
1e290 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1e2a0 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65   back..** Parame
1e2b0 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70  ter iPg is the p
1e2c0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  age number of sa
1e2d0 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74  id page. The pCt
1e2e0 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69  x argument .** i
1e2f0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69  s actually a poi
1e300 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1e310 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  r structure..**.
1e320 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69  ** If page iPg i
1e330 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
1e340 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20   cache, and has 
1e350 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
1e360 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74  eferences,.** it
1e370 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f   is discarded. O
1e380 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1e390 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
1e3a0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  re outstanding.*
1e3b0 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68  * references, th
1e3c0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
1e3d0 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20  s reloaded from 
1e3e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
1e3f0 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20   the.** attempt 
1e400 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e  to reload conten
1e410 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1e420 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ase is required 
1e430 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72  and fails, .** r
1e440 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1e450 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
1e460 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1e470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e480 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1e490 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67  k(void *pCtx, Pg
1e4a0 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72  no iPg){.  int r
1e4b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e4c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1e4d0 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a   (Pager *)pCtx;.
1e4e0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1e4f0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
1e500 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1e510 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
1e520 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
1e530 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70  r, iPg);.  if( p
1e540 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Pg ){.    if( sq
1e550 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
1e560 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20  efcount(pPg)==1 
1e570 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e580 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
1e590 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e5a0 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
1e5b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1e5c0 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
1e5d0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1e5e0 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d  Pg->pgno, &iFram
1e5f0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1e600 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e610 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
1e620 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61  DbPage(pPg, iFra
1e630 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1e640 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e660 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1e670 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  r(pPg);.      }.
1e680 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1e690 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
1e6a0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
1e6b0 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69    /* Normally, i
1e6c0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1e6d0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
1e6e0 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65  any backup proce
1e6f0 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70  sses are.  ** up
1e700 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73  dated as data is
1e710 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74   copied out of t
1e720 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1e730 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65  nal and into the
1e740 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
1e750 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65  This is not gene
1e760 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77  rally possible w
1e770 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61  ith a WAL databa
1e780 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c  se, as.  ** roll
1e790 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69  back involves si
1e7a0 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20  mply truncating 
1e7b0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68  the log file. Th
1e7c0 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a  erefore, if one.
1e7d0 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61    ** or more fra
1e7e0 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
1e7f0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1e800 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68   the log (and th
1e810 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c  erefore .  ** al
1e820 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  so copied into t
1e830 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61  he backup databa
1e840 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20  ses) as part of 
1e850 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1e860 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75  ,.  ** the backu
1e870 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61  ps must be resta
1e880 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rted..  */.  sql
1e890 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
1e8a0 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
1e8b0 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  p);..  return rc
1e8c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1e8d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1e8e0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ed to rollback a
1e8f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1e900 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a  a WAL database..
1e910 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1e920 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50  gerRollbackWal(P
1e930 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e940 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e960 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1e970 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1e980 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1e990 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1e9a0 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72  dirty pages to r
1e9b0 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46  evert */..  /* F
1e9c0 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20  or all pages in 
1e9d0 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61  the cache that a
1e9e0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  re currently dir
1e9f0 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61  ty or have alrea
1ea00 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69  dy.  ** been wri
1ea10 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f  tten (but not co
1ea20 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20  mmitted) to the 
1ea30 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65  log file, do one
1ea40 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f   of the .  ** fo
1ea50 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20  llowing:.  **.  
1ea60 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74  **   + Discard t
1ea70 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28  he cached page (
1ea80 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c  if refcount==0),
1ea90 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c   or.  **   + Rel
1eaa0 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
1eab0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1eac0 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e  se (if refcount>
1ead0 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  0)..  */.  pPage
1eae0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
1eaf0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
1eb00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1eb10 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  lUndo(pPager->pW
1eb20 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  al, pagerUndoCal
1eb30 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70  lback, (void *)p
1eb40 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20  Pager);.  pList 
1eb50 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1eb60 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1eb70 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69  >pPCache);.  whi
1eb80 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d  le( pList && rc=
1eb90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1eba0 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d    PgHdr *pNext =
1ebb0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1ebc0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
1ebd0 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64  doCallback((void
1ebe0 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74   *)pPager, pList
1ebf0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69  ->pgno);.    pLi
1ec00 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a  st = pNext;.  }.
1ec10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ec20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1ec30 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65  tion is a wrappe
1ec40 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
1ec50 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20  WalFrames(). As 
1ec60 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a  well as logging.
1ec70 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
1ec80 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70  of the list of p
1ec90 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20 70  ages headed by p
1eca0 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20  List (connected 
1ecb0 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74  by pDirty),.** t
1ecc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74  his function not
1ecd0 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76 65  ifies any active
1ece0 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1ecf0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 73  s that the pages
1ed00 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64   have.** changed
1ed10 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73  . .**.** The lis
1ed20 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73 65  t of pages passe
1ed30 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74  d into this rout
1ed40 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f  ine is always so
1ed50 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d  rted by page num
1ed60 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69  ber..** Hence, i
1ed70 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72 73  f page 1 appears
1ed80 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
1ed90 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62   list, it will b
1eda0 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1edb0 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74  ..*/ .static int
1edc0 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
1edd0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1ede0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1edf0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
1ee00 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ct */.  PgHdr *p
1ee10 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
1ee20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1ee30 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67  of frames to log
1ee40 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e   */.  Pgno nTrun
1ee50 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
1ee60 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1ee70 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69  e size after thi
1ee80 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e  s commit */.  in
1ee90 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eeb0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1eec0 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a   a commit */.){.
1eed0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eef0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1ef00 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b   */.  int nList;
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ef30 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73  of pages in pLis
1ef40 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 3b  t */.  PgHdr *p;
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1ef70 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73  oping over pages
1ef80 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1ef90 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20  Pager->pWal );. 
1efa0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29   assert( pList )
1efb0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1efc0 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66  DEBUG.  /* Verif
1efd0 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
1efe0 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e  list is in accen
1eff0 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
1f000 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26  for(p=pList; p &
1f010 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70  & p->pDirty; p=p
1f020 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61  ->pDirty){.    a
1f030 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c  ssert( p->pgno <
1f040 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f   p->pDirty->pgno
1f050 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
1f060 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
1f070 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73  >pDirty==0 || is
1f080 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20  Commit );.  if( 
1f090 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
1f0a0 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e  /* If a WAL tran
1f0b0 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
1f0c0 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72   committed, ther
1f0d0 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
1f0e0 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20   writing.    ** 
1f0f0 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70  any pages with p
1f100 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
1f110 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61  ter than nTrunca
1f120 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20  te into the WAL 
1f130 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  file..    ** The
1f140 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
1f150 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65  read by any clie
1f160 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68  nt. So remove th
1f170 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72  em from the pDir
1f180 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68  ty.    ** list h
1f190 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64  ere. */.    PgHd
1f1a0 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c  r **ppNext = &pL
1f1b0 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  ist;.    nList =
1f1c0 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   0;.    for(p=pL
1f1d0 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20  ist; (*ppNext = 
1f1e0 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72  p)!=0; p=p->pDir
1f1f0 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ty){.      if( p
1f200 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74  ->pgno<=nTruncat
1f210 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e  e ){.        ppN
1f220 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79  ext = &p->pDirty
1f230 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b  ;.        nList+
1f240 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1f250 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
1f260 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
1f270 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20     nList = 1;.  
1f280 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61  }.  pPager->aSta
1f290 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
1f2a0 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20  TE] += nList;.. 
1f2b0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
1f2c0 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
1f2d0 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
1f2e0 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73  pList);.  rc = s
1f2f0 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1f300 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20  pPager->pWal, . 
1f310 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
1f320 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54  eSize, pList, nT
1f330 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69  runcate, isCommi
1f340 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t, pPager->walSy
1f350 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69  ncFlags.  );.  i
1f360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f370 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63   && pPager->pBac
1f380 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  kup ){.    for(p
1f390 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1f3a0 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73  pDirty){.      s
1f3b0 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
1f3c0 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
1f3d0 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38  up, p->pgno, (u8
1f3e0 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20   *)p->pData);.  
1f3f0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
1f400 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1f410 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  ES.  pList = sql
1f420 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
1f430 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
1f440 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c  che);.  for(p=pL
1f450 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1f460 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  rty){.    pager_
1f470 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b  set_pagehash(p);
1f480 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
1f490 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f4a0 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20  ** Begin a read 
1f4b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f4c0 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  he WAL..**.** Th
1f4d0 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  is routine used 
1f4e0 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61  to be called "pa
1f4f0 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28  gerOpenSnapshot(
1f500 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73  )" because it es
1f510 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b  sentially.** mak
1f520 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66  es a snapshot of
1f530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
1f540 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69   the current poi
1f550 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70  nt in time and p
1f560 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74  reserves.** that
1f570 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73   snapshot for us
1f580 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20  e by the reader 
1f590 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63  in spite of conc
1f5a0 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73  urrently changes
1f5b0 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69   by.** other wri
1f5c0 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69  ters or checkpoi
1f5d0 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nters..*/.static
1f5e0 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52   int pagerBeginR
1f5f0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  eadTransaction(P
1f600 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f610 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f630 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1f640 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64  */.  int changed
1f650 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f660 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f670 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65  cache must be re
1f680 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
1f690 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1f6a0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
1f6b0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1f6c0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
1f6d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f6e0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
1f6f0 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61  ..  /* sqlite3Wa
1f700 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
1f710 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ion() was not ca
1f720 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65  lled for the pre
1f730 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73  vious.  ** trans
1f740 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e  action in lockin
1f750 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
1f760 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f  .  So call it no
1f770 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61  w.  If we.  ** a
1f780 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  re in locking_mo
1f790 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e  de=NORMAL and En
1f7a0 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76  dRead() was prev
1f7b0 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20  iously called,. 
1f7c0 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74   ** the duplicat
1f7d0 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65  e call is harmle
1f7e0 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
1f7f0 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
1f800 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1f810 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73  pWal);..  rc = s
1f820 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65  qlite3WalBeginRe
1f830 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
1f840 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61  ager->pWal, &cha
1f850 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21  nged);.  if( rc!
1f860 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68  =SQLITE_OK || ch
1f870 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67  anged ){.    pag
1f880 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1f890 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  ;.    if( USEFET
1f8a0 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
1f8b0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
1f8c0 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
1f8d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1f8e0 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
1f8f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1f900 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
1f910 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  rt of the transi
1f920 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f  tion from PAGER_
1f930 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52  OPEN.** to PAGER
1f940 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f  _READER state to
1f950 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1f960 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f970 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70  ase file.** in p
1f980 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74  ages (assuming t
1f990 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72  he page size cur
1f9a0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
1f9b0 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29   Pager.pageSize)
1f9c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
1f9d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
1f9e0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1f9f0 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  d and the size o
1fa00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
1fa10 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74  * in pages is st
1fa20 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e  ored in *pnPage.
1fa30 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
1fa40 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61  rror code (perha
1fa50 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  ps.** SQLITE_IOE
1fa60 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74  RR_FSTAT) is ret
1fa70 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
1fa80 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  e is left unmodi
1fa90 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
1faa0 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75  int pagerPagecou
1fab0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1fac0 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b  , Pgno *pnPage){
1fad0 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20  .  Pgno nPage;  
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faf0 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
1fb00 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
1fb10 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79  e */..  /* Query
1fb20 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1fb30 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61  tem for the data
1fb40 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57  base size. The W
1fb50 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20  alDbsize().  ** 
1fb60 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1fb70 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c   zero if the WAL
1fb80 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e   is not open (i.
1fb90 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30  e. Pager.pWal==0
1fba0 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68  ), or.  ** if th
1fbb0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1fbc0 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1fbd0 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1fbe0 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ize is not.  ** 
1fbf0 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
1fc00 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1fc10 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c  m if the log fil
1fc20 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20  e is empty or.  
1fc30 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76  ** contains no v
1fc40 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74  alid committed t
1fc50 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  ransactions..  *
1fc60 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1fc70 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1fc80 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
1fc90 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1fca0 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
1fcb0 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69  ;.  nPage = sqli
1fcc0 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61  te3WalDbsize(pPa
1fcd0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f  ger->pWal);..  /
1fce0 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
1fcf0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1fd00 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1fd10 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
1fd20 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d  he.  ** WAL sub-
1fd30 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e  system, determin
1fd40 65 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  e the page count
1fd50 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  e based on the s
1fd60 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ize of.  ** the 
1fd70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1fd80 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  If the size of t
1fd90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fda0 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20   is not an.  ** 
1fdb0 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
1fdc0 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
1fdd0 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68 65 20  e, round up the 
1fde0 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
1fdf0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
1fe00 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20     i64 n = 0;   
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66   /* Size of db f
1fe30 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1fe40 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
1fe50 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1fe60 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1fe70 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  le );.    if( is
1fe80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1fe90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1fea0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1feb0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
1fec0 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20   &n);.      if( 
1fed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fee0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fef0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1ff00 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50  }.    nPage = (P
1ff10 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e  gno)((n+pPager->
1ff20 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50  pageSize-1) / pP
1ff30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1ff40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1ff50 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  e current number
1ff60 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1ff70 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72   file is greater
1ff80 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63   than the.  ** c
1ff90 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75  onfigured maximu
1ffa0 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20  m pager number, 
1ffb0 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  increase the all
1ffc0 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20  owed limit so.  
1ffd0 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  ** that the file
1ffe0 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20   can be read..  
1fff0 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70  */.  if( nPage>p
20000 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
20010 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
20020 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67  gno = (Pgno)nPag
20030 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67  e;.  }..  *pnPag
20040 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
20050 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20060 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20070 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
20080 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77  Check if the *-w
20090 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72  al file that cor
200a0 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
200b0 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
200c0 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69  by pPager.** exi
200d0 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62  sts if the datab
200e0 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c  ase is not empy,
200f0 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20   or verify that 
20100 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64  the *-wal file d
20110 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74  oes.** not exist
20120 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74   (by deleting it
20130 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  ) if the databas
20140 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e  e file is empty.
20150 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
20160 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d  tabase is not em
20170 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61  pty and the *-wa
20180 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f  l file exists, o
20190 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  pen the pager.**
201a0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49   in WAL mode.  I
201b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
201c0 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f  s empty or if no
201d0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
201e0 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20  ts and.** if no 
201f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61  error occurs, ma
20200 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f  ke sure Pager.jo
20210 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74  urnalMode is not
20220 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52   set to.** PAGER
20230 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
20240 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
20250 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65  QLITE_OK or an e
20260 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
20270 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
20280 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c   hold a SHARED l
20290 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
202a0 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c  ase file to call
202b0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
202c0 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58  n. Because an EX
202d0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
202e0 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72  the db file is r
202f0 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74  equired to delet
20300 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61  e .** a WAL on a
20310 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61   none-empty data
20320 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72  base, this ensur
20330 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72  es there is no r
20340 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a  ace condition .*
20350 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41  * between the xA
20360 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e  ccess() below an
20370 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62  d an xDelete() b
20380 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79  eing executed by
20390 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20   some .** other 
203a0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
203b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
203c0 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
203d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
203e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
203f0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
20400 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
20410 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
20420 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20430 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
20440 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  CK );..  if( !pP
20450 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
20460 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b  {.    int isWal;
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20480 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57      /* True if W
20490 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  AL file exists *
204a0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  /.    Pgno nPage
204b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
204c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
204d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
204e0 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61   */..    rc = pa
204f0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
20500 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
20510 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20520 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50  n rc;.    if( nP
20530 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
20540 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
20550 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
20560 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
20570 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
20580 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
20590 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72  DELETE_NOENT ) r
205a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
205b0 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a       isWal = 0;.
205c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
205d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
205e0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
205f0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70   pPager->pVfs, p
20600 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c  Pager->zWal, SQL
20610 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
20620 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20  S, &isWal.      
20630 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
20640 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20650 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61  {.      if( isWa
20660 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  l ){.        tes
20670 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63  tcase( sqlite3Pc
20680 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
20690 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
206a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
206b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
206c0 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
206d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
206e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
206f0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
20700 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
20710 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20720 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
20730 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20740 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
20750 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20760 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
20770 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
20780 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
20790 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
207a0 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
207b0 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
207c0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
207d0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
207e0 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
207f0 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
20800 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
20810 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
20820 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
20830 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
20840 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
20850 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
20860 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
20870 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
20880 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
20890 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
208a0 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
208b0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
208c0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
208d0 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
208e0 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
208f0 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
20900 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
20910 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
20920 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
20930 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
20940 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
20950 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
20960 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
20970 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
20980 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
20990 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
209a0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
209b0 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
209c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
209d0 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
209e0 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
209f0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
20a00 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
20a10 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
20a20 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
20a30 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
20a40 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
20a50 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
20a60 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
20a70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
20a80 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
20a90 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
20aa0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
20ab0 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
20ac0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
20ad0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
20ae0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
20af0 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
20b00 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
20b10 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
20b20 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
20b30 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
20b40 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
20b50 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
20b60 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
20b70 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
20b80 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
20b90 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
20ba0 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
20bb0 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
20bc0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
20bd0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
20be0 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
20bf0 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
20c00 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
20c10 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
20c20 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
20c30 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
20c40 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
20c50 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
20c60 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
20c70 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
20c80 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
20c90 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
20ca0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
20cb0 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
20cc0 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
20cd0 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
20ce0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
20cf0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
20d00 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
20d10 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
20d20 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
20d30 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
20d40 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
20d50 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
20d60 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
20d70 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
20d80 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
20d90 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
20da0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
20db0 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
20dc0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
20dd0 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
20de0 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
20df0 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
20e00 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
20e10 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
20e20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
20e30 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
20e40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20e50 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
20e60 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
20e70 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
20e80 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
20e90 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20eb0 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
20ec0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20ed0 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
20ee0 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
20ef0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
20f00 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
20f10 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
20f20 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
20f30 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
20f40 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
20f50 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
20f60 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
20f70 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
20f80 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
20f90 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
20fa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20fb0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
20fc0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
20fd0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
20fe0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
20ff0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
21000 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
21010 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
21020 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
21030 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
21040 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
21050 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
21060 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
21070 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
21080 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
21090 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
210a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
210b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
210c0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
210d0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
210e0 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
210f0 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
21100 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
21110 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
21120 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
21130 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
21140 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
21150 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
21160 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
21170 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67  OrigSize;.  pPag
21180 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
21190 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
211a0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21  mpFile;..  if( !
211b0 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61  pSavepoint && pa
211c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
211d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
211e0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
211f0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
21200 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
21210 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
21220 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
21230 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
21240 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
21250 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
21260 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
21270 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
21280 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
21290 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
212a0 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
212b0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
212c0 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
212d0 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
212e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
212f0 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
21300 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
21310 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
21320 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
21330 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
21340 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a  0 || szJ==0 );..
21350 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
21360 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
21370 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
21380 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
21390 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
213a0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
213b0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
213c0 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
213d0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
213e0 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
213f0 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
21400 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
21410 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
21420 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
21430 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
21440 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
21450 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
21460 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
21470 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
21480 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
21490 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
214a0 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
214b0 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
214c0 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
214d0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ( pSavepoint && 
214e0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
214f0 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72  ger) ){.    iHdr
21500 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
21510 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
21520 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
21530 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
21540 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21550 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
21560 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
21570 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
21580 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
21590 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
215a0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
215b0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
215c0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
215d0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
215e0 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
215f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
21600 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21610 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
21620 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
21630 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
21640 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
21650 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
21660 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
21670 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
21680 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
21690 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
216a0 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
216b0 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
216c0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
216d0 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
216e0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
216f0 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
21700 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
21710 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
21720 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
21730 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
21740 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
21750 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
21760 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
21770 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
21780 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
21790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
217a0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
217b0 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
217c0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
217d0 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
217e0 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
217f0 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
21800 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
21810 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
21820 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
21830 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21840 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
21850 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
21860 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
21870 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
21880 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
21890 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
218a0 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
218b0 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
218c0 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
218d0 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
218e0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
218f0 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
21900 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
21910 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
21920 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
21930 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
21940 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21950 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
21960 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
21970 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
21980 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
21990 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
219a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
219b0 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
219c0 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
219d0 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
219e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
219f0 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
21a00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21a10 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
21a20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
21a30 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
21a40 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
21a50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
21a60 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
21a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21a80 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
21a90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
21aa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
21ab0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21ac0 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f>=szJ );..  /* 
21ad0 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
21ae0 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
21af0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
21b00 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
21b10 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
21b20 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
21b30 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
21b40 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
21b50 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
21b60 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
21b70 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
21b80 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
21b90 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
21ba0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
21bb0 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
21bc0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
21bd0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
21be0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34  64 offset = (i64
21bf0 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  )pSavepoint->iSu
21c00 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
21c10 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
21c20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
21c30 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
21c40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
21c50 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50  SavepointUndo(pP
21c60 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76  ager->pWal, pSav
21c70 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61  epoint->aWalData
21c80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
21c90 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e  (ii=pSavepoint->
21ca0 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c  iSubRec; rc==SQL
21cb0 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61  ITE_OK && ii<pPa
21cc0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69  ger->nSubRec; ii
21cd0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
21ce0 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29  t( offset==(i64)
21cf0 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
21d00 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
21d10 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
21d20 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
21d30 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
21d40 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
21d50 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
21d60 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
21d70 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
21d80 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
21d90 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
21da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21db0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21dc0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
21dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21de0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
21df0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
21e00 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
21e10 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
21e20 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74  wed.** before at
21e30 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63 79  tempting to recy
21e40 63 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e  cle clean and un
21e50 75 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76  used pages..*/.v
21e60 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
21e70 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
21e80 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
21e90 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
21ea0 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
21eb0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
21ec0 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
21ed0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
21ee0 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
21ef0 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
21f00 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
21f10 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  lowed.** before 
21f20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70  attempting to sp
21f30 69 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f 75  ill pages to jou
21f40 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
21f50 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c  ite3PagerSetSpil
21f60 6c 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  lsize(Pager *pPa
21f70 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
21f80 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
21f90 65 33 50 63 61 63 68 65 53 65 74 53 70 69 6c 6c  e3PcacheSetSpill
21fa0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
21fb0 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
21fc0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53  ../*.** Invoke S
21fd0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
21fe0 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74  _SIZE based on t
21ff0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
22000 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73   of szMmap..*/.s
22010 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
22020 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65  FixMaplimit(Page
22030 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20  r *pPager){.#if 
22040 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
22050 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33  SIZE>0.  sqlite3
22060 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
22070 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73  er->fd;.  if( is
22080 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e  Open(fd) && fd->
22090 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69  pMethods->iVersi
220a0 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c  on>=3 ){.    sql
220b0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20  ite3_int64 sz;. 
220c0 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e     sz = pPager->
220d0 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67  szMmap;.    pPag
220e0 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20  er->bUseFetch = 
220f0 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69  (sz>0);.    sqli
22100 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
22110 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
22120 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
22130 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20  AP_SIZE, &sz);. 
22140 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
22150 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
22160 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e  ximum size of an
22170 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  y memory mapping
22180 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64 61 74   made of the dat
22190 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76  abase file..*/.v
221a0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
221b0 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67  SetMmapLimit(Pag
221c0 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69  er *pPager, sqli
221d0 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
221e0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d  ){.  pPager->szM
221f0 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20  map = szMmap;.  
22200 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
22210 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
22220 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63 68 20  ** Free as much 
22230 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
22240 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  le from the page
22250 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
22260 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50 61  e3PagerShrink(Pa
22270 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
22280 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 72  sqlite3PcacheShr
22290 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ink(pPager->pPCa
222a0 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  che);.}../*.** A
222b0 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73 20 6f  djust settings o
222c0 66 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74  f the pager to t
222d0 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 69  hose specified i
222e0 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20 70 61  n the pgFlags pa
222f0 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
22300 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20 70 67  he "level" in pg
22310 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59  Flags & PAGER_SY
22320 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73  NCHRONOUS_MASK s
22330 65 74 73 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ets the robustne
22340 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ss.** of the dat
22350 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
22360 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
22370 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  s or power failu
22380 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69  res by.** changi
22390 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
223a0 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
223b0 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
223c0 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72  als..** There ar
223d0 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
223e0 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
223f0 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
22400 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
22410 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
22420 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
22430 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
22440 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
22450 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
22460 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
22470 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
22480 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
22490 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
224a0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
224b0 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
224c0 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
224d0 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
224e0 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
224f0 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
22500 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
22510 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
22520 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
22540 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
22550 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
22560 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
22570 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
22580 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
22590 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
225a0 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
225b0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
225c0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
225d0 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
225e0 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
225f0 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
22600 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
22610 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
22620 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
22640 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
22650 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
22660 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
22670 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
22680 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
22690 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
226a0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
226b0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
226c0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
226d0 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
226e0 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
226f0 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
22700 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
22710 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
22720 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
22730 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
22750 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
22760 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
22770 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
22780 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
22790 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
227a0 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
227b0 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
227c0 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
227d0 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
227e0 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d   for a rollback-
227f0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46  journal mode.  F
22800 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46  or WAL mode, OFF
22810 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f   continues.** to
22820 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79   mean that no sy
22830 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20  ncs ever occur. 
22840 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68   NORMAL means th
22850 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79  at the WAL is sy
22860 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  nced.** prior to
22870 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68   the start of ch
22880 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61  eckpoint and tha
22890 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
228a0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  ile is synced.**
228b0 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
228c0 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  on of the checkp
228d0 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69  oint if the enti
228e0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  re content of th
228f0 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69  e WAL.** was wri
22900 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
22910 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  he database.  Bu
22920 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74  t no sync operat
22930 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a  ions occur for.*
22940 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f  * an ordinary co
22950 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d  mmit in NORMAL m
22960 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46  ode with WAL.  F
22970 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
22980 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69  he WAL.** file i
22990 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  s synced followi
229a0 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f  ng each commit o
229b0 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64  peration, in add
229c0 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ition to the.** 
229d0 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64  syncs associated
229e0 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a   with NORMAL..**
229f0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75  .** Do not confu
22a00 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  se synchronous=F
22a10 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ULL with SQLITE_
22a20 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a  SYNC_FULL.  The.
22a30 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  ** SQLITE_SYNC_F
22a40 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20  ULL macro means 
22a50 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53  to use the MacOS
22a60 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79  X-style full-fsy
22a70 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74  nc.** using fcnt
22a80 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20  l(F_FULLFSYNC). 
22a90 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
22aa0 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  MAL means to do 
22ab0 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66  an.** ordinary f
22ac0 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68  sync() call.  Th
22ad0 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72  ere is no differ
22ae0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c  ence between SQL
22af0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a  ITE_SYNC_FULL.**
22b00 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43   and SQLITE_SYNC
22b10 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66  _NORMAL on platf
22b20 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20  orms other than 
22b30 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65  MacOSX.  But the
22b40 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  .** synchronous=
22b50 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63  FULL versus sync
22b60 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73  hronous=NORMAL s
22b70 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65  etting determine
22b80 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53  s when.** the xS
22b90 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73  ync primitive is
22ba0 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72   called and is r
22bb0 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70  elevant to all p
22bc0 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  latforms..**.** 
22bd0 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
22be0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
22bf0 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
22c00 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
22c10 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
22c20 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
22c30 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
22c40 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
22c50 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
22c60 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
22c70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
22c80 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61 66  pager to set saf
22c90 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f  ety level for */
22ca0 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
22cb0 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69  ags      /* Vari
22cc0 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  ous flags */.){.
22cd0 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c    unsigned level
22ce0 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41 47   = pgFlags & PAG
22cf0 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
22d00 41 53 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ASK;.  assert( l
22d10 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c  evel>=1 && level
22d20 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  <=3 );.  pPager-
22d30 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65  >noSync =  (leve
22d40 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
22d50 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
22d60 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
22d70 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26  nc = (level==3 &
22d80 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
22d90 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28  ile) ?1:0;.  if(
22da0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
22db0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
22dc0 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  yncFlags = 0;.  
22dd0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
22de0 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d  ncFlags = 0;.  }
22df0 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73  else if( pgFlags
22e00 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46 53 59   & PAGER_FULLFSY
22e10 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  NC ){.    pPager
22e20 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
22e30 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
22e40 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
22e50 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
22e60 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
22e70 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67  }else if( pgFlag
22e80 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46  s & PAGER_CKPT_F
22e90 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20  ULLFSYNC ){.    
22ea0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22eb0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22ec0 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
22ed0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
22ee0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22ef0 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  FULL;.  }else{. 
22f00 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
22f10 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22f20 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
22f30 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
22f40 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22f50 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  NC_NORMAL;.  }. 
22f60 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
22f70 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e  Flags = pPager->
22f80 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28  syncFlags;.  if(
22f90 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
22fa0 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
22fb0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d  >walSyncFlags |=
22fc0 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41   WAL_SYNC_TRANSA
22fd0 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66  CTIONS;.  }.  if
22fe0 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
22ff0 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a  R_CACHESPILL ){.
23000 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
23010 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
23020 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  FLAG_OFF;.  }els
23030 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  e{.    pPager->d
23040 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49  oNotSpill |= SPI
23050 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a  LLFLAG_OFF;.  }.
23060 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
23070 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
23080 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
23090 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
230a0 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
230b0 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
230c0 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
230d0 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
230e0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
230f0 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
23100 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
23110 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
23120 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
23130 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
23140 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
23150 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
23160 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
23170 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
23180 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
23190 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65   into *pFile. Re
231a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
231b0 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72  n success .** or
231c0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
231d0 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
231e0 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
231f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
23200 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
23210 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
23220 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
23230 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
23240 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20  ssed to the VFS 
23250 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61  layer xOpen() ca
23260 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65  ll are those spe
23270 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72  cified.** by par
23280 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20  ameter vfsFlags 
23290 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  ORed with the fo
232a0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
232b0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
232c0 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20  EADWRITE.**     
232d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
232e0 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
232f0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a  _OPEN_EXCLUSIVE.
23300 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
23310 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
23320 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
23330 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
23340 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
23350 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
23360 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
23370 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
23380 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
23390 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
233a0 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
233b0 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
233c0 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
233d0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
233e0 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
233f0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
23400 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
23410 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
23420 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
23430 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
23440 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
23450 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
23460 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
23470 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
23480 73 20 7c 3d 20 20 0a 23 69 66 20 53 51 4c 49 54  s |=  .#if SQLIT
23490 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
234a0 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20  OTECTION.       
234b0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66       (pPager->vf
234c0 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
234d0 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f  EN_FILEPROTECTIO
234e0 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a  N_MASK)|.#endif.
234f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
23500 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
23510 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
23520 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
23530 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23540 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
23550 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
23560 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
23570 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
23580 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
23590 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
235a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
235b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
235c0 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
235d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
235e0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
235f0 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
23600 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
23610 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
23620 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
23630 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
23640 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
23650 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
23660 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
23670 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
23680 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
23690 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
236a0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
236b0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
236c0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
236d0 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
236e0 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
236f0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
23700 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
23710 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
23720 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
23730 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
23740 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
23750 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
23760 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
23770 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
23780 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
23790 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237b0 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
237c0 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
237d0 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
237e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
237f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
23810 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
23820 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
23830 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
23840 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
23850 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
23860 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
23870 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
23880 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
23890 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
238a0 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
238b0 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
238c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
238d0 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
238e0 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
238f0 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
23900 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
23910 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
23920 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
23930 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
23940 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
23950 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
23960 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
23970 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
23980 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
23990 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
239a0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
239c0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
239d0 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
239e0 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
239f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
23a00 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
23a10 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
23a20 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
23a30 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
23a40 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
23a50 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
23a60 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
23a70 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
23a80 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
23a90 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
23aa0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
23ab0 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
23ac0 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  Arg;..  if( isOp
23ad0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
23ae0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20  {.    void **ap 
23af0 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67  = (void **)&pPag
23b00 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
23b10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
23b20 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28  int(*)(void *))(
23b30 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61  ap[0]))==xBusyHa
23b40 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73  ndler );.    ass
23b50 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73  ert( ap[1]==pBus
23b60 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20  yHandlerArg );. 
23b70 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
23b80 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
23b90 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
23ba0 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52  CNTL_BUSYHANDLER
23bb0 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20  , (void *)ap);. 
23bc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
23bd0 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
23be0 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
23bf0 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
23c00 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
23c10 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
23c20 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
23c30 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
23c40 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
23c50 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
23c60 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
23c70 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
23c80 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
23c90 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
23ca0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
23cb0 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
23cc0 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
23cd0 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  R, an SQLITE_IOE
23ce0 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20  RR_xxx sub-code 
23cf0 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
23d00 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
23d10 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
23d20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
23d30 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
23d40 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
23d50 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
23d60 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
23d70 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
23d80 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
23d90 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
23da0 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
23db0 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
23dc0 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
23dd0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
23de0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
23df0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
23e00 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
23e10 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
23e20 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
23e30 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
23e40 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
23e50 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
23e60 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
23e70 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
23e80 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
23e90 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
23ea0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
23eb0 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
23ec0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
23ed0 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
23ee0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
23ef0 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
23f00 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
23f10 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
23f20 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
23f30 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
23f40 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
23f50 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
23f60 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
23f70 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
23f80 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
23f90 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
23fa0 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
23fb0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
23fc0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
23fd0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
23fe0 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
23ff0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
24000 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
24010 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
24020 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
24030 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
24040 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
24050 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
24060 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
24070 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
24080 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
24090 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
240a0 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
240b0 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
240c0 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
240d0 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
240e0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
240f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24100 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
24110 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
24120 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  32 *pPageSize, i
24130 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
24140 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24150 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  OK;..  /* It is 
24160 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
24170 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74  do a full assert
24180 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68  _pager_state() h
24190 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a  ere, as this.  *
241a0 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  * function may b
241b0 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  e called from wi
241c0 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29  thin PagerOpen()
241d0 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61  , before the sta
241e0 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50  te.  ** of the P
241f0 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69  ager object is i
24200 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73  nternally consis
24210 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tent..  **.  ** 
24220 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69  At one point thi
24230 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
24240 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ned an error if 
24250 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
24260 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52   .  ** PAGER_ERR
24270 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69  OR state. But si
24280 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20  nce PAGER_ERROR 
24290 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73  state guarantees
242a0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65   that.  ** there
242b0 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   is at least one
242c0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
242d0 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69  e reference, thi
242e0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
242f0 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
24300 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e  hat case anyhow.
24310 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67  .  */..  u32 pag
24320 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
24330 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ze;.  assert( pa
24340 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
24350 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
24360 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
24370 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
24380 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
24390 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
243a0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
243b0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
243c0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
243d0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
243e0 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20  .   && pageSize 
243f0 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33  && pageSize!=(u3
24400 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
24410 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  ze .  ){.    cha
24420 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20  r *pNew = NULL; 
24430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24440 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f  ew temp space */
24450 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d  .    i64 nByte =
24460 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61   0;..    if( pPa
24470 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
24480 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e  R_OPEN && isOpen
24490 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
244a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
244b0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
244c0 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29  ger->fd, &nByte)
244d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
244e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
244f0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63  .      pNew = (c
24500 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
24510 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
24520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
24530 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ew ) rc = SQLITE
24540 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20  _NOMEM;.    }.. 
24550 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  E_OK ){.      pa
24570 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
24580 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
24590 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61  lite3PcacheSetPa
245a0 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  geSize(pPager->p
245b0 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65  PCache, pageSize
245c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
245d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
245e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
245f0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
24600 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
24610 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
24620 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
24630 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
24640 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65   = (Pgno)((nByte
24650 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67  +pageSize-1)/pag
24660 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
24670 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
24680 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d   pageSize;.    }
24690 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
246a0 74 65 33 50 61 67 65 46 72 65 65 28 70 4e 65 77  te3PageFree(pNew
246b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
246c0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61  *pPageSize = pPa
246d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
246e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
246f0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52  OK ){.    if( nR
24700 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65  eserve<0 ) nRese
24710 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  rve = pPager->nR
24720 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
24730 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
24740 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30  && nReserve<1000
24750 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
24760 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29  nReserve = (i16)
24770 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
24780 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
24790 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72  ager);.    pager
247a0 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67  FixMaplimit(pPag
247b0 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
247c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
247d0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
247e0 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
247f0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
24800 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
24810 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
24820 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
24830 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
24840 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
24850 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
24860 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
24870 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
24880 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
24890 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
248a0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
248b0 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
248c0 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
248d0 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
248e0 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
248f0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
24900 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
24910 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
24920 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
24930 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
24940 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
24950 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
24960 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
24970 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
24980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
24990 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
249a0 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
249b0 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
249c0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
249d0 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
249e0 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
249f0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
24a00 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
24a10 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
24a20 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
24a30 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
24a40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
24a50 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
24a60 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
24a70 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
24a80 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
24a90 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
24aa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
24ab0 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
24ac0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
24ad0 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
24ae0 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67  ge>0 ){.    pPag
24af0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50  er->mxPgno = mxP
24b00 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  age;.  }.  asser
24b10 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24b20 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e!=PAGER_OPEN );
24b30 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20        /* Called 
24b40 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67  only by OP_MaxPg
24b50 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  cnt */.  assert(
24b60 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e   pPager->mxPgno>
24b70 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
24b80 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63  );  /* OP_MaxPgc
24b90 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73  nt enforces this
24ba0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61   */.  return pPa
24bb0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
24bc0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
24bd0 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
24be0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
24bf0 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
24c00 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
24c10 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
24c20 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
24c30 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
24c40 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
24c50 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
24c60 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
24c70 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
24c80 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
24c90 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
24ca0 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
24cb0 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
24cc0 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
24cd0 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
24ce0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
24cf0 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
24d00 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
24d10 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
24d20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
24d30 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
24d40 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
24d50 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
24d60 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24d70 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
24d80 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
24d90 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
24da0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
24db0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
24dc0 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
24dd0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
24de0 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
24df0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
24e00 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
24e10 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
24e20 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
24e30 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
24e40 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
24e50 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
24e60 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
24e70 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
24e80 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
24e90 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
24ea0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
24eb0 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
24ec0 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
24ed0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
24ee0 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  ger was opened o
24ef0 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  n a transient fi
24f00 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22  le (zFilename=="
24f10 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64  "), or.** opened
24f20 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20   on a file less 
24f30 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20  than N bytes in 
24f40 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74  size, the output
24f50 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65   buffer is.** ze
24f60 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  roed and SQLITE_
24f70 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
24f80 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74   rationale for t
24f90 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
24fa0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
24fb0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61   used to read da
24fc0 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20  tabase headers, 
24fd0 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69  and a new transi
24fe0 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73  ent or.** zero s
24ff0 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ized database ha
25000 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20  s a header than 
25010 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
25020 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a  y of zeroes..**.
25030 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72  ** If any IO err
25040 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51  or apart from SQ
25050 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
25060 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74  _READ is encount
25070 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  ered,.** the err
25080 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
25090 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
250a0 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  r and the conten
250b0 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ts of the.** out
250c0 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66  put buffer undef
250d0 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ined..*/.int sql
250e0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
250f0 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
25100 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
25110 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
25120 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
25130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
25140 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
25150 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
25160 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
25170 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
25180 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  le );..  /* This
25190 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
251a0 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65   called by btree
251b0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
251c0 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  er creating.  **
251d0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
251e0 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f  t.  There has no
251f0 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74  t been an opport
25200 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74  unity to transit
25210 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20  ion.  ** to WAL 
25220 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  mode yet..  */. 
25230 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
25240 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
25250 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
25260 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
25270 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44    IOTRACE(("DBHD
25280 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50  R %p 0 %d\n", pP
25290 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63  ager, N)).    rc
252a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
252b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  (pPager->fd, pDe
252c0 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69  st, N, 0);.    i
252d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
252e0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
252f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
25300 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
25310 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25320 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25330 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62  ction may only b
25340 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  e called when a 
25350 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
25360 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74   is open on.** t
25370 68 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74  he pager. It ret
25380 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  urns the total n
25390 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
253a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
253b0 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69  **.** However, i
253c0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65  f the file is be
253d0 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67  tween 1 and <pag
253e0 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e  e-size> bytes in
253f0 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   size, then .** 
25400 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72  this is consider
25410 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65  ed a 1 page file
25420 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25430 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
25440 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25450 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61  nt *pnPage){.  a
25460 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
25470 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
25480 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
25490 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
254a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
254b0 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50  NISHED );.  *pnP
254c0 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65  age = (int)pPage
254d0 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f  r->dbSize;.}.../
254e0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
254f0 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
25500 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68  e locktype on th
25510 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
25520 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72   If.** a similar
25530 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
25540 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
25550 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
25560 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72  is a no-op.** (r
25570 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
25580 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e  OK immediately).
25590 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
255a0 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  , attempt to obt
255b0 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ain the lock usi
255c0 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  ng sqlite3OsLock
255d0 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74  (). Invoke .** t
255e0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
255f0 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
25600 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
25610 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20  ailable. Repeat 
25620 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75  .** until the bu
25630 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
25640 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  rns false or unt
25650 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  il the attempt t
25660 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65  o .** obtain the
25670 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
25680 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
25690 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
256a0 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
256b0 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
256c0 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
256d0 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
256e0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63   is obtained suc
256f0 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74  cessfully, set t
25700 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a  he Pager.state .
25710 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c  ** variable to l
25720 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72  ocktype before r
25730 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
25740 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
25750 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
25760 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
25770 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
25780 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
257b0 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  /..  /* Check th
257c0 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65  at this is eithe
257d0 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75  r a no-op (becau
257e0 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  se the requested
257f0 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61   lock is .  ** a
25800 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72  lready held), or
25810 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e   one of the tran
25820 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65  sitions that the
25830 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20   busy-handler.  
25840 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65  ** may be invoke
25850 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64  d during, accord
25860 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65  ing to the comme
25870 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71  nt above.  ** sq
25880 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
25890 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f  yhandler()..  */
258a0 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
258b0 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74  er->eLock>=lockt
258c0 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ype).       || (
258d0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
258e0 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  O_LOCK && lockty
258f0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  pe==SHARED_LOCK)
25900 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
25910 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  er->eLock==RESER
25920 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  VED_LOCK && lock
25930 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
25940 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f  LOCK).  );..  do
25950 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65   {.    rc = page
25960 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
25970 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68  locktype);.  }wh
25980 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
25990 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e  BUSY && pPager->
259a0 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  xBusyHandler(pPa
259b0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
259c0 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72  rArg) );.  retur
259d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
259e0 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72  unction assertTr
259f0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25a00 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20  (pPager) checks 
25a10 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
25a20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
25a30 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69   true for all di
25a40 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e  rty pages curren
25a50 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d  tly in the page-
25a60 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  cache:.**.**   a
25a70 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  ) The page numbe
25a80 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
25a90 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73  r equal to the s
25aa0 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  ize of the .**  
25ab0 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61      current data
25ac0 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70  base image, in p
25ad0 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20  ages, OR.**.**  
25ae0 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20   b) if the page 
25af0 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69  content were wri
25b00 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d  tten at this tim
25b10 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
25b20 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73  **      be neces
25b30 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
25b40 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
25b50 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62  t out to the sub
25b60 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20  -journal.**     
25b70 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
25b80 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a  by function subj
25b90 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e  RequiresPage()).
25ba0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
25bb0 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64  ndition asserted
25bc0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
25bd0 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
25be0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74   and the.** dirt
25bf0 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62  y page were to b
25c00 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d  e discarded from
25c10 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74   the cache via t
25c20 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29  he pagerStress()
25c30 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67  .** routine, pag
25c40 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64  erStress() would
25c50 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63   not write the c
25c60 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
25c70 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61  ent to.** the da
25c80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
25c90 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e  a savepoint tran
25ca0 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c  saction were rol
25cb0 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a  led back after.*
25cc0 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c  * this happened,
25cd0 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
25ce0 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74  avior would be t
25cf0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
25d00 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74  rrent.** content
25d10 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f   of the page. Ho
25d20 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69  wever, since thi
25d30 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
25d40 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68   present in eith
25d50 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  er.** the databa
25d60 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70  se file or the p
25d70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f  ortion of the ro
25d80 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
25d90 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  nd .** sub-journ
25da0 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  al rolled back t
25db0 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64  he content could
25dc0 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64   not be restored
25dd0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61   and the.** data
25de0 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64  base image would
25df0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
25e00 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65   It is therefore
25e10 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20   fortunate that 
25e20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73  .** this circums
25e30 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69  tance cannot ari
25e40 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  se..*/.#if defin
25e50 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
25e60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
25e70 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25e80 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70  raintCb(PgHdr *p
25e90 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg){.  assert( p
25ea0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
25eb0 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72  DIRTY );.  asser
25ec0 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  t( !subjRequires
25ed0 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67  Page(pPg) || pPg
25ee0 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61  ->pgno<=pPg->pPa
25ef0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d  ger->dbSize );.}
25f00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
25f10 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25f20 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  raint(Pager *pPa
25f30 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  ger){.  sqlite3P
25f40 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
25f50 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
25f60 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  e, assertTruncat
25f70 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a  eConstraintCb);.
25f80 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
25f90 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
25fa0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
25fb0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
25fc0 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d  Truncate the in-
25fd0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
25fe0 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50  file image to nP
25ff0 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20  age pages. This 
26000 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  .** function doe
26010 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
26020 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
26030 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  se file on disk.
26040 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74   It .** just set
26050 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
26060 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
26070 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  r object so that
26080 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74   the .** truncat
26090 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  ion will be done
260a0 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
260b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
260c0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
260d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
260e0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72  is only called r
260f0 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  ight before comm
26100 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
26110 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68  tion..** Once th
26120 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
26130 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65  been called, the
26140 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
26150 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72  t either be.** r
26160 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f  olled back or co
26170 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e  mmitted. It is n
26180 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20  ot safe to call 
26190 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
261a0 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e  d.** then contin
261b0 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  ue writing to th
261c0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76  e database..*/.v
261d0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
261e0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61  TruncateImage(Pa
261f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
26200 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  o nPage){.  asse
26210 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
26220 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61  ze>=nPage );.  a
26230 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
26240 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
26250 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
26260 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
26270 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20   = nPage;..  /* 
26280 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65  At one point the
26290 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65   code here calle
262a0 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
262b0 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a  Constraint() to.
262c0 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74    ** ensure that
262d0 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67   all pages being
262e0 20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79 20   truncated away 
262f0 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
26300 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f  n are,.  ** if o
26310 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70  ne or more savep
26320 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20  oints are open, 
26330 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73  present in the s
26340 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a  avepoint .  ** j
26350 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74  ournal so that t
26360 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f  hey can be resto
26370 72 65 64 20 69 66 20 74 68 65 20 73 61 76 65 70  red if the savep
26380 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20  oint is rolled. 
26390 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69   ** back. This i
263a0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65  s no longer nece
263b0 73 73 61 72 79 20 61 73 20 74 68 69 73 20 66 75  ssary as this fu
263c0 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e  nction is now on
263d0 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72  ly.  ** called r
263e0 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  ight before comm
263f0 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
26400 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67  tion. So althoug
26410 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  h the .  ** Page
26420 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69  r object may sti
26430 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76  ll have open sav
26440 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e  epoints (Pager.n
26450 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a  Savepoint!=0), .
26460 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74    ** they cannot
26470 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
26480 20 53 6f 20 74 68 65 20 61 73 73 65 72 74 54 72   So the assertTr
26490 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
264a0 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20  () call.  ** is 
264b0 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63  no longer correc
264c0 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  t. */.}.../*.** 
264d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
264e0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61   called before a
264f0 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d  ttempting a hot-
26500 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
26510 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68  . It.** syncs th
26520 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
26530 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74  o disk, then set
26540 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  s pPager->journa
26550 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73  lHdr to the.** s
26560 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
26570 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  al file so that 
26580 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
26590 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f  ck() routine kno
265a0 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65  ws.** that the e
265b0 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ntire journal fi
265c0 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
265d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e  ed..**.** Syncin
265e0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
265f0 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61  to disk before a
26600 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c  ttempting to rol
26610 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65  l it back ensure
26620 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20  s .** that if a 
26630 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63  power-failure oc
26640 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
26650 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72  rollback, the pr
26660 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74  ocess that.** at
26670 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20  tempts rollback 
26680 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d  following system
26690 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74   recovery sees t
266a0 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a  he same journal.
266b0 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68  ** content as th
266c0 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  is process..**.*
266d0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
266e0 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c  goes as planned,
266f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26700 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
26710 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65  e, .** an SQLite
26720 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
26730 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
26740 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50  SyncHotJournal(P
26750 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26760 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26770 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67  _OK;.  if( !pPag
26780 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
26790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
267a0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
267b0 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
267c0 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  RMAL);.  }.  if(
267d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
267e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
267f0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
26800 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
26810 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
26820 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
26830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  .}../*.** Obtain
26840 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
26850 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  a memory mapped 
26860 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  page object for 
26870 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
26880 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62  . .** The new ob
26890 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68  ject will use th
268a0 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c  e pointer pData,
268b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78   obtained from x
268c0 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73  Fetch()..** If s
268d0 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a  uccessful, set *
268e0 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20  ppPage to point 
268f0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  to the new page 
26900 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64  reference.** and
26910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26920 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  K. Otherwise, re
26930 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
26940 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65  rror code and se
26950 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20  t.** *ppPage to 
26960 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  zero..**.** Page
26970 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61   references obta
26980 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ined by calling 
26990 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
269a0 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64  ould be released
269b0 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70  .** by calling p
269c0 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
269d0 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ge()..*/.static 
269e0 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65  int pagerAcquire
269f0 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67 65 72  MapPage(.  Pager
26a00 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
26a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
26a20 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
26a30 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a  /* Page number *
26a60 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  /.  void *pData,
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27      /* xFetch()'
26a90 64 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  d data for this 
26aa0 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
26ab0 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20 20 20  **ppPage        
26ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26ad0 3a 20 41 63 71 75 69 72 65 64 20 70 61 67 65 20  : Acquired page 
26ae0 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50  object */.){.  P
26af0 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
26b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26b10 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  * Memory mapped 
26b20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  page to return *
26b30 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67 65  /.  .  if( pPage
26b40 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
26b50 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
26b60 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  = p = pPager->pM
26b70 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20  mapFreelist;.   
26b80 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26b90 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72  eelist = p->pDir
26ba0 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
26bb0 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65  y = 0;.    memse
26bc0 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20  t(p->pExtra, 0, 
26bd0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
26be0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
26bf0 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48  pPage = p = (PgH
26c00 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  dr *)sqlite3Mall
26c10 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
26c20 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  Hdr) + pPager->n
26c30 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20  Extra);.    if( 
26c40 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
26c50 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
26c60 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
26c70 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
26c80 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
26c90 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ta);.      retur
26ca0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
26cb0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78      }.    p->pEx
26cc0 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  tra = (void *)&p
26cd0 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  [1];.    p->flag
26ce0 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a  s = PGHDR_MMAP;.
26cf0 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
26d00 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d  .    p->pPager =
26d10 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20   pPager;.  }..  
26d20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72  assert( p->pExtr
26d30 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d  a==(void *)&p[1]
26d40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26d50 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61  >pPage==0 );.  a
26d60 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d  ssert( p->flags=
26d70 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20  =PGHDR_MMAP );. 
26d80 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
26d90 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
26da0 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d  assert( p->nRef=
26db0 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f  =1 );..  p->pgno
26dc0 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44   = pgno;.  p->pD
26dd0 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70  ata = pData;.  p
26de0 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b  Pager->nMmapOut+
26df0 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  +;..  return SQL
26e00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26e10 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
26e20 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67  ence to page pPg
26e30 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20  . pPg must have 
26e40 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79  been returned by
26e50 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20   an .** earlier 
26e60 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71  call to pagerAcq
26e70 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  uireMapPage()..*
26e80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
26e90 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
26ea0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
26eb0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
26ec0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
26ed0 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
26ee0 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  --;.  pPg->pDirt
26ef0 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  y = pPager->pMma
26f00 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61  pFreelist;.  pPa
26f10 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26f20 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73  st = pPg;..  ass
26f30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d  ert( pPager->fd-
26f40 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
26f50 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69  ion>=3 );.  sqli
26f60 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
26f70 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
26f80 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67  Pg->pgno-1)*pPag
26f90 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
26fa0 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  g->pData);.}../*
26fb0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48  .** Free all PgH
26fc0 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65  dr objects store
26fd0 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70  d in the Pager.p
26fe0 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73  MmapFreelist lis
26ff0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
27000 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64  d pagerFreeMapHd
27010 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  rs(Pager *pPager
27020 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
27030 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
27040 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
27050 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b  MmapFreelist; p;
27060 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
27070 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  Next = p->pDirty
27080 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
27090 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(p);.  }.}.../
270a0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
270b0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
270c0 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
270d0 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
270e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
270f0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
27100 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
27110 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
27120 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
27130 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
27140 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
27150 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
27160 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
27170 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
27180 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
27190 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
271a0 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
271b0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
271c0 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
271d0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
271e0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
271f0 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
27200 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
27210 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
27220 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
27230 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
27240 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
27250 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
27260 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
27270 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
27280 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
27290 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
272a0 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
272b0 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
272c0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
272d0 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
272e0 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
272f0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
27300 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
27310 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
27320 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
27330 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
27340 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
27350 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
27360 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
27370 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
27380 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
27390 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
273a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
273b0 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64    pagerFreeMapHd
273c0 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a  rs(pPager);.  /*
273d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
273e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
273f0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
27400 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
27410 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
27420 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
27430 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
27440 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
27450 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
27460 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20  eSize, pTmp);.  
27470 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30  pPager->pWal = 0
27480 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72  ;.#endif.  pager
27490 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
274a0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
274b0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
274c0 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
274d0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
274e0 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65  s open, sync the
274f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
27500 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c  fore calling Unl
27510 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a  ockAndRollback..
27520 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
27530 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e  s not done, then
27540 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   an unsynced por
27550 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e  tion of the open
27560 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
27570 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61   file may be pla
27580 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
27590 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
275a0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
275b0 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68  ccurs .    ** wh
275c0 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
275d0 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
275e0 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65  ase could become
275f0 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a   corrupt..    **
27600 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72  .    ** If an er
27610 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
27620 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20   trying to sync 
27630 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69  the journal, shi
27640 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ft the pager.   
27650 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52   ** into the ERR
27660 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63  OR state. This c
27670 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52  auses UnlockAndR
27680 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63  ollback to unloc
27690 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  k the.    ** dat
276a0 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20  abase and close 
276b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
276c0 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74   without attempt
276d0 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20  ing to roll it. 
276e0 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69     ** back or fi
276f0 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e  nalize it. The n
27700 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65  ext database use
27710 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64  r will have to d
27720 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  o hot-journal.  
27730 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65    ** rollback be
27740 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74  fore accessing t
27750 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27760 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27770 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27780 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61  jfd) ){.      pa
27790 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
277a0 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  , pagerSyncHotJo
277b0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a  urnal(pPager));.
277c0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55      }.    pagerU
277d0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
277e0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
277f0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
27800 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
27810 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
27820 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
27830 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
27840 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
27850 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
27860 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
27870 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
27880 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
27890 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69  er->jfd);.  sqli
278a0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
278b0 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
278c0 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
278d0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
278e0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
278f0 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
27900 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
27910 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
27920 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
27930 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
27940 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
27950 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
27960 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
27970 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
27980 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
27990 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
279a0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
279b0 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
279c0 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
279d0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
279e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
279f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
27a00 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
27a10 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
27a20 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
27a30 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
27a40 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
27a50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
27a60 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
27a70 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
27a80 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
27a90 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
27aa0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
27ab0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
27ac0 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
27ad0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
27ae0 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
27af0 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
27b00 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
27b10 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
27b20 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
27b30 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
27b40 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
27b50 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
27b60 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
27b70 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
27b80 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
27b90 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
27ba0 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
27bb0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
27bc0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
27bd0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
27be0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
27bf0 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
27c00 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  c flag is set, t
27c10 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27c20 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
27c30 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
27c40 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
27c50 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
27c60 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20  ournal-mode and 
27c70 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63  the .** device c
27c80 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
27c90 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
27ca0 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
27cb0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
27cc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
27cd0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
27ce0 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
27cf0 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
27d00 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
27d10 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
27d20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
27d30 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27d40 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
27d50 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
27d60 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
27d70 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
27d80 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
27d90 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
27da0 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
27db0 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
27dc0 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
27dd0 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
27de0 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
27df0 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
27e00 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
27e10 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
27e20 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
27e30 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
27e40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27e50 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
27e60 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
27e70 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
27e80 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
27e90 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
27ea0 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
27eb0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
27ec0 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
27ed0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
27ee0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
27ef0 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
27f00 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
27f10 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
27f20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
27f30 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
27f40 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
27f50 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
27f60 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
27f70 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
27f80 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
27f90 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
27fa0 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
27fb0 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
27fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
27fd0 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
27fe0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
27ff0 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
28000 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
28010 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
28020 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
28030 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
28040 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
28050 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
28060 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
28070 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
28080 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
28090 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
280a0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
280b0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
280c0 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
280d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
280e0 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
280f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
28100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
28110 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
28120 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28130 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
28140 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
28150 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
28160 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
28170 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
28180 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
28190 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
281a0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
281b0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
281c0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
281d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
281e0 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
281f0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
28200 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28210 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
28220 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
28230 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
28240 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
28250 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
28260 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
28270 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28280 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
28290 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
282a0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
282b0 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
282c0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
282d0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
282e0 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
282f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
28300 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
28310 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
28320 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
28330 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
28340 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
28350 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
28360 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
28370 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
28380 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
28390 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
283a0 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
283b0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
283c0 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
283d0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
283e0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
283f0 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
28400 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
28410 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
28420 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
28430 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
28440 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
28450 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
28460 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
28470 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
28480 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
28490 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
284a0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
284b0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
284c0 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
284d0 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
284e0 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
284f0 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
28500 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
28510 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
28520 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
28530 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
28540 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
28550 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
28560 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28570 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
28580 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
28590 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
285a0 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
285b0 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
285c0 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
285d0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
285e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
285f0 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
28600 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
28610 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
28620 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
28630 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
28640 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
28650 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
28660 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
28670 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
28680 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
28690 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
286a0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
286b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
286c0 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
286d0 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
286e0 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
286f0 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
28700 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
28710 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
28720 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
28730 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
28740 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
28750 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
28760 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
28770 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
28780 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
28790 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
287a0 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
287b0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
287c0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
287d0 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
287e0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
287f0 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
28800 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
28810 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
28820 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
28830 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
28840 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
28850 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
28860 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
28870 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
28880 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
28890 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
288a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
288b0 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
288c0 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
288d0 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
288e0 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
288f0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
28900 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
28910 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
28920 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
28930 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
28940 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
28950 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
28960 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
28970 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
28980 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
28990 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
289a0 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
289b0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
289c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
289d0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
289e0 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
289f0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
28a00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
28a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
28a20 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
28a30 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
28a40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
28a50 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
28a60 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
28a70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28a80 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
28a90 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
28aa0 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
28ab0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
28ac0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
28ae0 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
28af0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
28b00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
28b10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
28b20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
28b30 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
28b40 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28b50 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
28b60 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
28b70 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
28b80 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
28b90 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
28ba0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
28bb0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
28bc0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
28bd0 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
28be0 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
28bf0 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
28c00 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
28c10 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
28c20 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
28c30 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
28c40 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
28c50 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
28c60 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
28c70 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
28c80 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
28c90 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
28ca0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
28cb0 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
28cc0 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
28cd0 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
28ce0 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
28cf0 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
28d00 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
28d10 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
28d20 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
28d30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
28d40 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
28d50 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
28d60 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
28d70 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
28d80 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
28d90 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
28da0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
28db0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
28dc0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
28dd0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
28de0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
28df0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
28e00 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
28e10 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
28e20 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
28e30 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
28e40 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
28e50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
28e60 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
28e70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
28e80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28e90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28ea0 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
28eb0 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
28ec0 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
28ed0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
28ee0 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
28ef0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
28f00 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
28f10 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
28f20 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
28f30 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
28f40 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
28f50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28f60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28f70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28f80 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
28f90 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
28fa0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
28fb0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
28fc0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
28fd0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
28fe0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
28ff0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
29000 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
29010 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
29020 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
29030 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
29040 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
29050 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
29060 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
29070 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
29080 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
29090 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
290a0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
290b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
290c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
290d0 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
290e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
290f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
29100 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
29110 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
29120 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
29130 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
29140 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
29150 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
29160 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
29170 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
29180 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29190 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
291a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
291b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
291c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
291d0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
291e0 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
291f0 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
29200 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
29210 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
29220 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
29230 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
29240 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
29250 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
29260 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
29270 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
29280 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
29290 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
292a0 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
292b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
292c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
292d0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
292e0 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
292f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
29300 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
29310 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29320 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
29330 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
29340 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
29350 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
29360 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
29370 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
29380 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
29390 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
293a0 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
293b0 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
293c0 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
293d0 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
293e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
293f0 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
29400 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
29410 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
29420 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
29430 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
29440 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
29450 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
29460 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
29470 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
29480 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
29490 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
294a0 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
294b0 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
294c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
294d0 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
294e0 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
294f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
29500 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
29510 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
29520 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
29530 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
29540 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
29550 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
29560 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
29570 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
29580 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
29590 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
295a0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
295b0 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
295c0 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
295d0 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
295e0 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
295f0 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
29600 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
29610 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
29620 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
29630 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
29640 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
29650 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
29660 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
29670 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
29680 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
29690 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
296a0 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
296b0 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
296c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
296d0 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
296e0 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
296f0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
29700 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
29710 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
29720 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
29730 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
29740 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
29750 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
29760 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
29770 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
29780 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
29790 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
297a0 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
297b0 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
297c0 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
297d0 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
297e0 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
297f0 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
29800 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
29810 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
29820 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
29830 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
29840 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
29850 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
29860 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
29870 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
29880 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
29890 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
298a0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
298b0 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
298c0 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
298d0 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
298e0 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
298f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
29900 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
29910 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
29920 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
29930 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
29940 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29960 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
29970 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
29980 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
29990 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
299a0 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
299b0 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
299c0 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
299d0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
299e0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
299f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
29a00 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
29a10 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
29a20 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
29a30 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
29a40 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
29a50 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
29a60 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
29a70 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
29a80 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
29a90 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
29aa0 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
29ab0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
29ac0 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
29ad0 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
29ae0 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
29af0 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
29b00 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
29b10 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
29b20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
29b30 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
29b40 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
29b50 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
29b60 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
29b70 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
29b80 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
29b90 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
29ba0 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
29bb0 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
29bc0 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
29bd0 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
29be0 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
29bf0 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
29c00 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
29c10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
29c20 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
29c30 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
29c40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29c50 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64  .   && pPager->d
29c60 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72  bHintSize<pPager
29c70 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28  ->dbSize.   && (
29c80 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c  pList->pDirty ||
29c90 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61   pList->pgno>pPa
29ca0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29  ger->dbHintSize)
29cb0 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
29cc0 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
29cd0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
29ce0 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
29cf0 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
29d00 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
29d10 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
29d20 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
29d30 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
29d40 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20  NT, &szFile);.  
29d50 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
29d60 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
29d70 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68  bSize;.  }..  wh
29d80 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
29d90 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
29da0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
29db0 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
29dc0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
29dd0 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
29de0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
29df0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
29e00 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
29e10 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
29e20 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
29e30 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
29e40 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
29e50 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
29e60 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
29e70 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
29e80 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
29e90 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
29ea0 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
29eb0 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
29ec0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
29ed0 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
29ee0 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
29ef0 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
29f00 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
29f10 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
29f20 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
29f30 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
29f40 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
29f50 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
29f60 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
29f70 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
29f80 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
29f90 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
29fa0 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
29fb0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
29fc0 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
29fd0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
29fe0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a010 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
2a020 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
2a030 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d   assert( (pList-
2a040 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2a050 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2a060 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
2a070 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
2a080 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
2a090 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20  er(pList);..    
2a0a0 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
2a0b0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
2a0c0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2a0d0 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
2a0e0 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
2a0f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
2a100 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ta);..      /* W
2a110 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
2a120 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
2a130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2a140 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
2a150 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
2a160 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
2a170 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2a180 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
2a190 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
2a1a0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
2a1b0 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
2a1c0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
2a1d0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
2a1e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
2a1f0 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
2a200 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
2a210 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
2a220 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
2a230 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
2a240 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
2a250 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
2a260 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2a270 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
2a280 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
2a290 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
2a2a0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
2a2b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2a2c0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
2a2d0 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
2a2e0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
2a2f0 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
2a300 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
2a310 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
2a320 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a  STAT_WRITE]++;..
2a330 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
2a340 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  any backup objec
2a350 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63  ts copying the c
2a360 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
2a370 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  pager. */.      
2a380 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
2a390 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
2a3a0 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
2a3b0 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a  pList->pData);..
2a3c0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2a3d0 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  (("STORE %d page
2a3e0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
2a3f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2a400 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
2a410 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
2a420 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
2a430 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  t)));.      IOTR
2a440 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
2a450 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
2a460 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
2a470 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
2a480 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
2a490 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nt);.    }else{.
2a4a0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2a4b0 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  (("NOSTORE %d pa
2a4c0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2a4d0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
2a4e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
2a4f0 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
2a500 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73  pList);.    pLis
2a510 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
2a520 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  y;.  }..  return
2a530 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
2a540 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75  sure that the su
2a550 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  b-journal file i
2a560 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73  s open. If it is
2a570 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
2a580 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
2a590 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2a5a0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2a5b0 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72  returned if ever
2a5c0 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f  ything goes acco
2a5d0 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41  rding to plan. A
2a5e0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  n .** SQLITE_IOE
2a5f0 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
2a600 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
2a610 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2a620 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66  e3OsOpen() .** f
2a630 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
2a640 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  int openSubJourn
2a650 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
2a660 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2a670 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
2a680 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2a690 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20  jfd) ){.    if( 
2a6a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2a6b0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2a6c0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c  ALMODE_MEMORY ||
2a6d0 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
2a6e0 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73  emory ){.      s
2a6f0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
2a700 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2a710 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
2a720 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f       rc = pagerO
2a730 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
2a740 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51  pPager->sjfd, SQ
2a750 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
2a760 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  RNAL);.    }.  }
2a770 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a780 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
2a790 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75  record of the cu
2a7a0 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70  rrent state of p
2a7b0 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73  age pPg to the s
2a7c0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a  ub-journal. .**.
2a7d0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2a7e0 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f  , set the bit co
2a7f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
2a800 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20  Pg->pgno in the 
2a810 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61  bitvecs.** for a
2a820 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
2a830 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ts before return
2a840 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
2a850 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2a860 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
2a870 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2a880 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a  essful, an IO.**
2a890 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74   error code if t
2a8a0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
2a8b0 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ite to the sub-j
2a8c0 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
2a8d0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
2a8e0 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
2a8f0 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e  ils while settin
2a900 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76  g a bit in a sav
2a910 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63  epoint.** bitvec
2a920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a930 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50  subjournalPage(P
2a940 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e  gHdr *pPg){.  in
2a950 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a960 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2a970 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2a980 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
2a990 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2a9a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2a9b0 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  F ){..    /* Ope
2a9c0 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
2a9d0 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  l, if it has not
2a9e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
2a9f0 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65  ened */.    asse
2aa00 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2aa10 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73  ournal );.    as
2aa20 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2aa30 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67  ger->jfd) || pag
2aa40 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2aa50 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2aa60 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2aa70 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
2aa80 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20  nSubRec==0 );.  
2aa90 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
2aaa0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20  seWal(pPager) . 
2aab0 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49          || pageI
2aac0 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  nJournal(pPager,
2aad0 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20   pPg) .         
2aae0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
2aaf0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2ab00 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2ab10 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2ab20 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
2ab30 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
2ab40 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
2ab50 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
2ab60 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
2ab70 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
2ab80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
2ab90 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
2aba0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
2abb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2abc0 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
2abd0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
2abe0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
2abf0 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e  = (i64)pPager->n
2ac00 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
2ac10 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
2ac20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
2ac30 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
2ac40 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
2ac50 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
2ac60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2ac70 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
2ac80 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2ac90 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
2aca0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2acb0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2acc0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
2acd0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
2ace0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
2acf0 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
2ad00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2ad10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ad20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ad30 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2ad40 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
2ad50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2ad60 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
2ad70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2ad80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ad90 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
2ada0 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
2adb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2adc0 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
2add0 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
2ade0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
2adf0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2ae00 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2ae10 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
2ae20 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49   subjournalPageI
2ae30 66 52 65 71 75 69 72 65 64 28 50 67 48 64 72 20  fRequired(PgHdr 
2ae40 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62  *pPg){.  if( sub
2ae50 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
2ae60 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
2ae70 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2ae80 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pPg);.  }else{. 
2ae90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2aea0 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
2aeb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2aec0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
2aed0 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
2aee0 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
2aef0 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
2af00 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
2af10 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
2af20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2af30 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
2af40 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
2af50 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
2af60 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
2af70 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
2af80 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
2af90 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
2afa0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
2afb0 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
2afc0 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
2afd0 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
2afe0 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
2aff0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
2b000 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
2b010 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
2b020 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
2b030 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
2b040 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
2b050 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
2b060 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
2b070 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
2b080 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
2b090 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
2b0a0 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
2b0b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b0c0 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
2b0d0 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
2b0e0 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
2b0f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
2b100 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2b110 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
2b120 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
2b130 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
2b140 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
2b150 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2b160 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2b170 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2b180 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
2b190 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
2b1a0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2b1b0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
2b1c0 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
2b1d0 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
2b1e0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
2b1f0 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
2b200 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
2b210 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2b220 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2b230 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2b240 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
2b250 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2b260 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
2b270 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
2b280 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
2b290 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
2b2a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2b2b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
2b2c0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
2b2d0 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
2b2e0 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
2b2f0 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20  GHDR_DIRTY );.. 
2b300 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   /* The doNotSpi
2b310 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73  ll NOSYNC bit is
2b320 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65   set during time
2b330 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73  s when doing a s
2b340 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72  ync of.  ** jour
2b350 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20  nal (and adding 
2b360 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73  a new header) is
2b370 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54   not allowed.  T
2b380 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  his occurs.  ** 
2b390 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20  during calls to 
2b3a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b3b0 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67  e() while trying
2b3c0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74   to journal mult
2b3d0 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  iple.  ** pages 
2b3e0 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
2b3f0 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20   same sector..  
2b400 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f  **.  ** The doNo
2b410 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  tSpill ROLLBACK 
2b420 61 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68  and OFF bits inh
2b430 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20  ibits all cache 
2b440 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65  spilling.  ** re
2b450 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2b460 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e  her or not a syn
2b470 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  c is required.  
2b480 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69  This is set duri
2b490 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  ng.  ** a rollba
2b4a0 63 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65  ck or by user re
2b4b0 71 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76  quest, respectiv
2b4c0 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ely..  **.  ** S
2b4d0 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20  pilling is also 
2b4e0 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20  prohibited when 
2b4f0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
2b500 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75  e since that cou
2b510 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20  ld.  ** lead to 
2b520 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
2b530 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75  ion.   In the cu
2b540 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
2b550 74 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73  tion it .  ** is
2b560 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
2b570 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
2b580 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65  ch() to be calle
2b590 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  d with createFla
2b5a0 67 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20  g==3.  ** while 
2b5b0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
2b5c0 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20  te, hence it is 
2b5d0 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  impossible for t
2b5e0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20  his routine to. 
2b5f0 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e   ** be called in
2b600 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2b610 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
2b620 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45   we include a NE
2b630 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20  VER().  ** test 
2b640 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  for the error st
2b650 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61  ate as a safegua
2b660 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72  rd against futur
2b670 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a  e changes..  */.
2b680 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
2b690 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
2b6a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b6b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2b6c0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2b6d0 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  & SPILLFLAG_ROLL
2b6e0 42 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61  BACK );.  testca
2b6f0 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  se( pPager->doNo
2b700 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
2b710 41 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74  AG_OFF );.  test
2b720 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2b730 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2b740 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20  FLAG_NOSYNC );. 
2b750 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
2b760 6f 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28  otSpill.   && ((
2b770 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2b780 6c 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f  ll & (SPILLFLAG_
2b790 52 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c  ROLLBACK|SPILLFL
2b7a0 41 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20  AG_OFF))!=0.    
2b7b0 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73    || (pPg->flags
2b7c0 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
2b7d0 4e 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20  NC)!=0).  ){.   
2b7e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b7f0 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70  K;.  }..  pPg->p
2b800 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28  Dirty = 0;.  if(
2b810 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2b820 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ger) ){.    /* W
2b830 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72  rite a single fr
2b840 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ame for this pag
2b850 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f  e to the log. */
2b860 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75  .    rc = subjou
2b870 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72  rnalPageIfRequir
2b880 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66  ed(pPg); .    if
2b890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b8a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
2b8b0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
2b8c0 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b  ger, pPg, 0, 0);
2b8d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2b8e0 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
2b8f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b900 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2b910 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
2b920 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2b930 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  NC .     || pPag
2b940 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2b950 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
2b960 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  D.    ){.      r
2b970 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
2b980 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2b990 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74  }.  .    /* Writ
2b9a0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2b9b0 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
2b9c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2b9d0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
2b9e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b9f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2ba00 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2ba10 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
2ba20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2ba30 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
2ba40 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  t(pPager, pPg);.
2ba50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2ba60 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
2ba70 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
2ba80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ba90 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
2baa0 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
2bab0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2bac0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2bad0 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
2bae0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2baf0 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
2bb00 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
2bb10 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a  r(pPager, rc); .
2bb20 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
2bb30 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  ll unreferenced 
2bb40 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64  dirty pages to d
2bb50 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  isk..*/.int sqli
2bb60 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61  te3PagerFlush(Pa
2bb70 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2bb80 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
2bb90 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20  >errCode;.  if( 
2bba0 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67  !MEMDB ){.    Pg
2bbb0 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  Hdr *pList = sql
2bbc0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
2bbd0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
2bbe0 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  che);.    assert
2bbf0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2bc00 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2bc10 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
2bc20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
2bc30 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  t ){.      PgHdr
2bc40 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
2bc50 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69  >pDirty;.      i
2bc60 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d  f( pList->nRef==
2bc70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2bc80 3d 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76  = pagerStress((v
2bc90 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  oid*)pPager, pLi
2bca0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
2bcb0 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74     pList = pNext
2bcc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
2bcd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2bce0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
2bcf0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
2bd00 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e   Pager object an
2bd10 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
2bd20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50  to it.** in *ppP
2bd30 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20  ager. The pager 
2bd40 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c  should eventuall
2bd50 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61  y be freed by pa
2bd60 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73  ssing it.** to s
2bd70 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
2bd80 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  ()..**.** The zF
2bd90 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
2bda0 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20   is the path to 
2bdb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2bdc0 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66  e to open..** If
2bdd0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
2bde0 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
2bdf0 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
2be00 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
2be10 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
2be20 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
2be30 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61   cached. Tempora
2be40 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20  ry files are be 
2be50 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
2be60 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
2be70 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49  ey are closed. I
2be80 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
2be90 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a  :memory:" then .
2bea0 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ** all informati
2beb0 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
2bec0 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72  che. It is never
2bed0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2bee0 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62  . .** This can b
2bef0 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
2bf00 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent an in-memory
2bf10 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
2bf20 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61   The nExtra para
2bf30 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20  meter specifies 
2bf40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
2bf50 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
2bf60 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
2bf70 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72  with each page r
2bf80 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73  eference. This s
2bf90 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
2bfa0 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a  e to the user.**
2bfb0 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
2bfc0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20  PagerGetExtra() 
2bfd0 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  API..**.** The f
2bfe0 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
2bff0 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
2c000 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
2c010 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
2c020 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
2c030 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
2c040 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
2c050 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
2c060 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
2c070 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a  GER_* flags..**.
2c080 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
2c090 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
2c0a0 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
2c0b0 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
2c0c0 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
2c0d0 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
2c0e0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
2c0f0 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
2c100 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
2c110 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2c120 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
2c130 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
2c140 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
2c150 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
2c160 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2c170 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
2c180 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
2c190 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
2c1a0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
2c1b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
2c1c0 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
2c1d0 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
2c1e0 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
2c1f0 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2c200 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
2c210 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
2c220 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
2c230 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
2c240 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
2c250 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
2c260 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
2c270 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
2c280 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2c290 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
2c2a0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2c2b0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2c2c0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
2c2d0 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
2c2e0 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
2c2f0 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
2c300 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
2c310 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2c320 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2c330 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
2c340 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2c350 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2c360 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
2c370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2c380 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
2c390 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
2c3a0 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2c3b0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2c3c0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2c3d0 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
2c3e0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
2c3f0 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
2c400 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
2c410 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
2c420 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2c430 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
2c440 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
2c450 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
2c460 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
2c470 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
2c480 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
2c490 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
2c4a0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2c4b0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
2c4c0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
2c4d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2c4e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2c4f0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
2c500 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
2c510 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
2c520 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
2c530 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
2c540 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
2c550 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2c560 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2c570 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
2c580 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
2c590 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
2c5a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2c5b0 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
2c5c0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
2c5d0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
2c5e0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2c5f0 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
2c600 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
2c610 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
2c620 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
2c630 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
2c640 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
2c650 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
2c660 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c670 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
2c680 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
2c690 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
2c6a0 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
2c6b0 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
2c6c0 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
2c6d0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
2c6e0 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
2c6f0 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2c700 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
2c710 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2c720 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32   PCache */.  u32
2c730 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2c740 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2c750 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
2c760 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
2c770 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c780 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  Uri = 0;    /* U
2c790 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20  RI args to copy 
2c7a0 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  */.  int nUri = 
2c7b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
2c7c0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2c7d0 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20   of URI args at 
2c7e0 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46  *zUri */..  /* F
2c7f0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
2c800 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
2c810 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
2c820 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2c830 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
2c840 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
2c850 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
2c860 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
2c870 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
2c880 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
2c890 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
2c8a0 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
2c8b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2c8c0 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
2c8d0 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
2c8e0 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
2c8f0 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
2c900 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
2c910 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
2c920 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
2c930 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
2c940 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
2c950 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
2c960 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
2c970 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2c980 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2c990 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
2c9a0 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
2c9b0 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
2c9c0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
2c9d0 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2c9e0 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
2c9f0 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
2ca00 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2ca10 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2ca20 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2ca30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
2ca40 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2ca50 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2ca60 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
2ca70 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
2ca80 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
2ca90 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
2caa0 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
2cab0 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
2cac0 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  ager = 0;..#ifnd
2cad0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
2cae0 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c  EMORYDB.  if( fl
2caf0 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f  ags & PAGER_MEMO
2cb00 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20  RY ){.    memDb 
2cb10 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  = 1;.    if( zFi
2cb20 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2cb30 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ame[0] ){.      
2cb40 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2cb50 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a  te3DbStrDup(0, z
2cb60 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2cb70 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2cb80 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  0  ) return SQLI
2cb90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2cba0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2cbb0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2cbc0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46  hname);.      zF
2cbd0 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
2cbe0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2cbf0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
2cc00 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
2cc10 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
2cc20 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
2cc30 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
2cc40 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
2cc50 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
2cc60 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
2cc70 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
2cc80 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
2cc90 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
2cca0 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
2ccb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2ccc0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2ccd0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f  ame[0] ){.    co
2cce0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
2ccf0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
2cd00 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2cd10 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
2cd20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2cd30 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65  Raw(0, nPathname
2cd40 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
2cd50 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
2cd60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cd70 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
2cd80 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
2cd90 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
2cda0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
2cdb0 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
2cdc0 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
2cdd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2cde0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
2cdf0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
2ce00 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
2ce10 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  e);.    nPathnam
2ce20 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2ce30 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2ce40 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26      z = zUri = &
2ce50 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65  zFilename[sqlite
2ce60 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
2ce70 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ame)+1];.    whi
2ce80 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
2ce90 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2cea0 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20  en30(z)+1;.     
2ceb0 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2cec0 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2ced0 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e  }.    nUri = (in
2cee0 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29  t)(&z[1] - zUri)
2cef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55  ;.    assert( nU
2cf00 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ri>=0 );.    if(
2cf10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2cf20 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
2cf30 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
2cf40 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2cf50 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
2cf60 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
2cf70 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
2cf80 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
2cf90 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
2cfa0 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
2cfb0 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
2cfc0 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
2cfd0 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
2cfe0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
2cff0 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
2d000 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
2d010 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
2d020 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
2d030 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2d040 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
2d050 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
2d060 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2d070 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
2d080 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2d090 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
2d0a0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2d0b0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2d0c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d0d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2d0e0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2d0f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d100 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
2d110 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
2d120 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
2d130 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
2d140 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
2d150 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
2d160 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
2d170 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
2d180 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
2d190 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
2d1a0 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
2d1b0 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
2d1c0 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
2d1d0 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
2d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1f0 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
2d200 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2d210 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
2d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d230 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
2d240 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
2d250 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2d260 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2d270 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
2d280 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
2d290 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
2d2a0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2d2b0 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2d2c0 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2d2d0 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
2d2e0 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2d2f0 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2d300 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2d310 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2d320 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2d330 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2d340 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
2d350 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
2d360 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2d370 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2d380 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
2d390 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
2d3a0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2d3b0 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
2d3c0 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
2d3d0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
2d3e0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
2d3f0 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2d400 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
2d410 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
2d420 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
2d430 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
2d440 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
2d450 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
2d460 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2d470 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
2d480 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
2d490 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
2d4a0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d4b0 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f  nUri +         /
2d4c0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
2d4d0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
2d4e0 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2d4f0 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
2d500 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d510 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e  OMIT_WAL.    + n
2d520 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32  Pathname + 4 + 2
2d530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2d540 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  Wal */.#endif.  
2d550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2d560 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2d570 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  T(SQLITE_INT_TO_
2d580 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  PTR(journalFileS
2d590 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21  ize)) );.  if( !
2d5a0 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pPtr ){.    sqli
2d5b0 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2d5c0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
2d5d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d5e0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
2d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
2d600 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
2d610 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
2d620 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
2d630 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
2d640 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
2d650 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
2d660 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2d670 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2d680 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
2d690 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
2d6a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2d6b0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2d6c0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
2d6d0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
2d6e0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2d6f0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2d700 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
2d710 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
2d720 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
2d730 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2d740 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
2d750 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2d760 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
2d770 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
2d780 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
2d790 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
2d7a0 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
2d7b0 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
2d7c0 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
2d7d0 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
2d7e0 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29  t( nPathname>0 )
2d7f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  ;.    pPager->zJ
2d800 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72  ournal =   (char
2d810 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68  *)(pPtr += nPath
2d820 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29  name + 1 + nUri)
2d830 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2d840 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2d850 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2d860 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  name);.    if( n
2d870 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50  Uri ) memcpy(&pP
2d880 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2d890 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55  nPathname+1], zU
2d8a0 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  ri, nUri);.    m
2d8b0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
2d8c0 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ournal, zPathnam
2d8d0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2d8e0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2d8f0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2d900 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61  hname], "-journa
2d910 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20  l\000", 8+2);.  
2d920 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2d930 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2d940 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2d950 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64  zJournal);.#ifnd
2d960 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2d970 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  AL.    pPager->z
2d980 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  Wal = &pPager->z
2d990 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2d9a0 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  e+8+1];.    memc
2d9b0 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  py(pPager->zWal,
2d9c0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2d9d0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2d9e0 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c  py(&pPager->zWal
2d9f0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77  [nPathname], "-w
2da00 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20  al\000", 4+1);. 
2da10 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2da20 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2da30 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2da40 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20  >zWal);.#endif. 
2da50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2da60 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2da70 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
2da80 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
2da90 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
2daa0 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
2dab0 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
2dac0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2dad0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2dae0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2daf0 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
2db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db10 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
2db20 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
2db30 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
2db40 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2db50 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
2db60 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
2db70 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
2db80 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
2db90 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65  !memDb );.    re
2dba0 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
2dbb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2dbc0 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
2dbd0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
2dbe0 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
2dbf0 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
2dc00 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
2dc10 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
2dc20 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
2dc30 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
2dc40 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
2dc50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2dc60 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2dc70 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
2dc80 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
2dc90 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
2dca0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2dcb0 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
2dcc0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
2dcd0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
2dce0 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
2dcf0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
2dd00 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
2dd10 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
2dd20 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
2dd30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2dd40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2dd50 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2dd60 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2dd70 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2dd80 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2dd90 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29   if( !readOnly )
2dda0 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63  {.        setSec
2ddb0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2ddc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2ddd0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2dde0 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2ddf0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2de00 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
2de10 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2de20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2de30 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
2de40 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
2de50 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
2de60 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2de70 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
2de80 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2de90 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2dea0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
2deb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2dec0 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2ded0 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2dee0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2def0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2df00 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2df10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2df20 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
2df30 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
2df40 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
2df50 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2df60 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
2df70 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
2df80 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2df90 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
2dfa0 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
2dfb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2dfc0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2dfd0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2dfe0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
2dff0 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
2e000 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
2e010 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2e020 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
2e030 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2e040 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
2e050 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
2e060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e070 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2e080 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  i;.            }
2e090 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e0a0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2e0b0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
2e0c0 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c  er->noLock = sql
2e0d0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2e0e0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c  (zFilename, "nol
2e0f0 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ock", 0);.      
2e100 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54  if( (iDc & SQLIT
2e110 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c  E_IOCAP_IMMUTABL
2e120 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  E)!=0.       || 
2e130 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
2e140 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ean(zFilename, "
2e150 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29  immutable", 0) )
2e160 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46  {.          vfsF
2e170 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2e180 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2e190 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74          goto act
2e1a0 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b  _like_temp_file;
2e1b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e1c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2e1d0 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
2e1e0 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
2e1f0 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
2e200 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
2e210 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2e220 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
2e230 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2e240 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
2e250 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
2e260 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
2e270 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
2e280 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
2e290 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2e2a0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
2e2b0 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
2e2c0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2e2d0 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
2e2e0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2e2f0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
2e300 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
2e310 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2e320 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
2e330 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
2e340 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
2e350 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
2e360 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2e370 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66  anch also runs f
2e380 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20  or files marked 
2e390 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20  as immutable..  
2e3a0 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74    */ .act_like_t
2e3b0 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65  emp_file:.    te
2e3c0 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
2e3d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2e3e0 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20   PAGER_READER;  
2e3f0 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2e400 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
2e410 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67  lock */.    pPag
2e420 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c  er->eLock = EXCL
2e430 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f  USIVE_LOCK;    /
2e440 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65  * Pretend we are
2e450 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f   in EXCLUSIVE mo
2e460 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  de */.    pPager
2e470 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20  ->noLock = 1;   
2e480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e490 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f  Do no locking */
2e4a0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2e4b0 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
2e4c0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2e4d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
2e4e0 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
2e4f0 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
2e500 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
2e510 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
2e520 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
2e530 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
2e540 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
2e550 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
2e560 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2e570 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e580 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2e590 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
2e5a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2e5b0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
2e5c0 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
2e5d0 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
2e5e0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
2e5f0 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
2e600 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50  Initialize the P
2e610 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f  Cache object. */
2e620 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2e630 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2e640 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20  rt( nExtra<1000 
2e650 29 3b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20  );.    nExtra = 
2e660 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a  ROUND8(nExtra);.
2e670 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e680 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
2e690 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
2e6a0 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
2e6c0 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
2e6d0 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
2e6e0 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
2e6f0 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  che);.  }..  /* 
2e700 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2e710 72 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65 65  rred above, free
2e720 20 74 68 65 20 20 50 61 67 65 72 20 73 74 72 75   the  Pager stru
2e730 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
2e740 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
2e750 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e760 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2e770 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2e780 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
2e790 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
2e7a0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
2e7b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2e7c0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
2e7d0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41  rn rc;.  }..  PA
2e7e0 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20  GERTRACE(("OPEN 
2e7f0 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
2e800 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66  NDLEID(pPager->f
2e810 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  d), pPager->zFil
2e820 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41  ename));.  IOTRA
2e830 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
2e840 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
2e850 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
2e860 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
2e870 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a  urnal = (u8)useJ
2e880 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61  ournal;.  /* pPa
2e890 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
2e8a0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e8b0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
2e8c0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e8d0 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
2e8e0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2e8f0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2e900 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
2e910 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2e920 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
2e930 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2e940 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
2e950 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
2e960 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e970 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
2e980 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  CK; */.  /* pPag
2e990 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
2e9a0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
2e9b0 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d  mpFile = (u8)tem
2e9c0 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
2e9d0 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2e9e0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
2e9f0 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
2ea00 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
2ea10 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2ea20 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
2ea30 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2ea40 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2ea50 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
2ea60 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
2ea70 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a   (u8)tempFile; .
2ea80 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2ea90 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
2eaa0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2eab0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
2eac0 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61  (u8)memDb;.  pPa
2ead0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
2eae0 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  (u8)readOnly;.  
2eaf0 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e  assert( useJourn
2eb00 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  al || pPager->te
2eb10 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67  mpFile );.  pPag
2eb20 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
2eb30 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2eb40 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2eb50 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  c = pPager->noSy
2eb60 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65  nc ?0:1;.  pPage
2eb70 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 70  r->syncFlags = p
2eb80 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20  Pager->noSync ? 
2eb90 30 20 3a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  0 : SQLITE_SYNC_
2eba0 4e 4f 52 4d 41 4c 3b 0a 20 20 70 50 61 67 65 72  NORMAL;.  pPager
2ebb0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
2ebc0 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  = pPager->syncFl
2ebd0 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ags;.  if( pPage
2ebe0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2ebf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ec00 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a  >fullSync==0 );.
2ec10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ec20 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30  er->syncFlags==0
2ec30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ec40 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2ec50 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61  lags==0 );.    a
2ec60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
2ec70 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  kptSyncFlags==0 
2ec80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ec90 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2eca0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2ecb0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
2ecc0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2ecd0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  ;.    pPager->wa
2ece0 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  lSyncFlags = SQL
2ecf0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
2ed00 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53  | WAL_SYNC_TRANS
2ed10 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61  ACTIONS;.    pPa
2ed20 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2ed30 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2ed40 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f  _NORMAL;.  }.  /
2ed50 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2ed60 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2ed70 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
2ed80 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
2ed90 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
2eda0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2edb0 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
2edc0 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
2edd0 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2ede0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2edf0 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
2ee00 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
2ee10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2ee20 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
2ee30 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
2ee40 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
2ee50 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
2ee60 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2ee70 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2ee80 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
2ee90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
2eea0 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
2eeb0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2eec0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2eed0 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
2eee0 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
2eef0 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
2ef00 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
2ef10 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
2ef20 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
2ef30 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
2ef40 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28  it;.  /* memset(
2ef50 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
2ef60 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
2ef70 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f  >aHash)); */.  /
2ef80 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70  * pPager->szMmap
2ef90 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2efa0 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77  T_MMAP_SIZE // w
2efb0 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62 74  ill be set by bt
2efc0 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50  ree.c */..  *ppP
2efd0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
2efe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2eff0 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79  K;.}.../* Verify
2f000 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
2f010 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
2f020 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65  be deleted or re
2f030 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a  named out from.*
2f040 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61 67 65  * under the page
2f050 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
2f060 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61  E_OK if the data
2f070 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 65  base is still we
2f080 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74  re it ought.** t
2f090 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52  o be on disk.  R
2f0a0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28  eturn non-zero (
2f0b0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
2f0c0 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20  DBMOVED or some 
2f0d0 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63  other error.** c
2f0e0 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ode from sqlite3
2f0f0 4f 73 41 63 63 65 73 73 28 29 29 20 69 66 20 74  OsAccess()) if t
2f100 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
2f110 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f  gone missing..*/
2f120 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61 74 61  .static int data
2f130 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61  baseIsUnmoved(Pa
2f140 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2f150 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20  int bHasMoved = 
2f160 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  0;.  int rc;..  
2f170 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
2f180 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
2f190 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
2f1a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
2f1b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2f1c0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
2f1d0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2f1e0 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c   && pPager->zFil
2f1f0 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63  ename[0] );.  rc
2f200 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
2f210 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
2f220 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
2f230 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61  _HAS_MOVED, &bHa
2f240 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72  sMoved);.  if( r
2f250 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
2f260 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ND ){.    /* If 
2f270 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69  the HAS_MOVED fi
2f280 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e  le-control is un
2f290 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73  implemented, ass
2f2a0 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
2f2b0 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74  e.    ** has not
2f2c0 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68   been moved.  Th
2f2d0 61 74 20 69 73 20 74 68 65 20 68 69 73 74 6f 72  at is the histor
2f2e0 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66  ical behavior of
2f2f0 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74   SQLite: prior t
2f300 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  o.    ** version
2f310 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72   3.8.3, it never
2f320 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20   checked */.    
2f330 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2f340 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2f350 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61  SQLITE_OK && bHa
2f360 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63  sMoved ){.    rc
2f370 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
2f380 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a  LY_DBMOVED;.  }.
2f390 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f3a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2f3b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
2f3c0 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69  fter transitioni
2f3d0 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e  ng from PAGER_UN
2f3e0 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52  LOCK to.** PAGER
2f3f0 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49  _SHARED state. I
2f400 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65  t tests if there
2f410 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2f420 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20  l present in.** 
2f430 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2f440 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
2f450 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ger. A hot journ
2f460 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a  al is one that .
2f470 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ** needs to be p
2f480 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f  layed back. Acco
2f490 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75  rding to this fu
2f4a0 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f  nction, a hot-jo
2f4b0 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78  urnal.** file ex
2f4c0 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c  ists if the foll
2f4d0 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61  owing criteria a
2f4e0 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
2f4f0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2f500 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  le exists in the
2f510 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e   file system, an
2f520 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63  d.**   * No proc
2f530 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2f540 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
2f550 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2f560 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a  base file, and.*
2f570 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61  *   * The databa
2f580 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69  se file itself i
2f590 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
2f5a0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
2f5b0 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66  and.**   * The f
2f5c0 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
2f5d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2f5e0 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20  ists and is not 
2f5f0 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  0x00..**.** If t
2f600 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
2f610 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2f620 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
2f630 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2f640 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
2f650 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
2f660 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
2f670 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
2f680 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
2f690 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49  the same name. I
2f6a0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2f6b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
2f6c0 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ** just deleted 
2f6d0 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20  using OsDelete, 
2f6e0 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2f6f0 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2f700 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2f710 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
2f720 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63  utine does not c
2f730 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73  heck if there is
2f740 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
2f750 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74  l filename.** at
2f760 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2f770 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
2f780 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74  s, and that mast
2f790 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  er journal file.
2f7a0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
2f7b0 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  t, then the jour
2f7c0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2f7d0 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74  really hot. In t
2f7e0 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73  his.** case this
2f7f0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
2f800 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  turn a false-pos
2f810 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72  itive. The pager
2f820 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72  _playback().** r
2f830 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63  outine will disc
2f840 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f  over that the jo
2f850 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
2f860 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64  t really hot and
2f870 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f   .** will not ro
2f880 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a  ll it back. .**.
2f890 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ** If a hot-jour
2f8a0 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  nal file is foun
2f8b0 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78  d to exist, *pEx
2f8c0 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31  ists is set to 1
2f8d0 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f   and .** SQLITE_
2f8e0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2f8f0 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  no hot-journal f
2f900 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ile is present, 
2f910 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73  *pExists is.** s
2f920 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
2f930 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2f940 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2f950 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2f960 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  ng.** to determi
2f970 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
2f980 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  t a hot-journal 
2f990 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65  file exists, the
2f9a0 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64   IO error.** cod
2f9b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
2f9c0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  d the value of *
2f9d0 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66  pExists is undef
2f9e0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
2f9f0 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
2fa00 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
2fa10 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a   int *pExists){.
2fa20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
2fa30 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
2fa40 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
2fa50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2fa60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2fa70 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2fa80 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20  nt exists = 1;  
2fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2faa0 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61  True if a journa
2fab0 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
2fac0 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f  t */.  int jrnlO
2fad0 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70  pen = !!isOpen(p
2fae0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20  Pager->jfd);..  
2faf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fb00 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
2fb10 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2fb20 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
2fb30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fb40 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2fb50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  EN );..  assert(
2fb60 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20   jrnlOpen==0 || 
2fb70 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  ( sqlite3OsDevic
2fb80 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2fb90 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a  (pPager->jfd) &.
2fba0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
2fbb0 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
2fbc0 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20  N_OPEN.  ));..  
2fbd0 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  *pExists = 0;.  
2fbe0 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
2fbf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2fc00 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
2fc10 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2fc20 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
2fc30 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
2fc40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2fc50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69  SQLITE_OK && exi
2fc60 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  sts ){.    int l
2fc70 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20  ocked = 0;      
2fc80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2fc90 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68  f some process h
2fca0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
2fcb0 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  lock */..    /* 
2fcc0 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68  Race condition h
2fcd0 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72  ere:  Another pr
2fce0 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65  ocess might have
2fcf0 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68   been holding th
2fd00 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53  e.    ** the RES
2fd10 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68  ERVED lock and h
2fd20 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70  ave a journal op
2fd30 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65  en at the sqlite
2fd40 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20  3OsAccess() .   
2fd50 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20   ** call above, 
2fd60 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20  but then delete 
2fd70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
2fd80 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65  drop the lock be
2fd90 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67  fore.    ** we g
2fda0 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  et to the follow
2fdb0 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65  ing sqlite3OsChe
2fdc0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
2fdd0 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a   call.  If that.
2fde0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61      ** is the ca
2fdf0 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
2fe00 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65   might think the
2fe10 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
2fe20 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  nal when.    ** 
2fe30 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73  in fact there is
2fe40 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73   none.  This res
2fe50 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d  ults in a false-
2fe60 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77  positive which w
2fe70 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65  ill.    ** be de
2fe80 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20  alt with by the 
2fe90 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65  playback routine
2fea0 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e  .  Ticket #3883.
2feb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2fec0 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2fed0 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
2fee0 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
2fef0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2ff00 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b  LITE_OK && !lock
2ff10 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  ed ){.      Pgno
2ff20 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2ff30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ff40 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
2ff50 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2ff60 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2ff70 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2ff80 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
2ff90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ffa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
2ffb0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2ffc0 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69   is zero pages i
2ffd0 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61  n size, that mea
2ffe0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28  ns that either (
2fff0 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  1) the.        *
30000 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72  * journal is a r
30010 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72  emnant from a pr
30020 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74  ior database wit
30030 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
30040 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  where.        **
30050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30060 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a  le but not the j
30070 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74  ournal was delet
30080 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69  ed, or (2) the i
30090 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a  nitial.        *
300a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
300b0 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e  at populates a n
300c0 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62  ew database is b
300d0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
300e0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
300f0 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65  either case, the
30100 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
30110 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48  n be deleted.  H
30120 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72  owever, take car
30130 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  e.        ** not
30140 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
30150 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
30160 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
30170 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20  n due to.       
30180 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   ** journal_mode
30190 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20  =PERSIST..      
301a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
301b0 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72   nPage==0 && !jr
301c0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
301d0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
301e0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
301f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
30200 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
30210 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
30220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30230 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30240 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
30250 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
30260 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
30270 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
30280 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20  exclusiveMode ) 
30290 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
302a0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
302b0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
302c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
302d0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
302e0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
302f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
30300 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
30310 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
30320 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
30330 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
30340 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
30350 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
30360 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30370 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
30380 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
30390 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
303a0 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
303b0 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
303c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
303d0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
303e0 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
303f0 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
30400 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
30410 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
30420 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
30430 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
30440 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
30450 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
30460 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
30470 20 20 20 20 20 69 6e 74 20 66 20 3d 20 0a 23 69       int f = .#i
30480 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
30490 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
304a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
304b0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26  Pager->vfsFlags&
304c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45  SQLITE_OPEN_FILE
304d0 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29  PROTECTION_MASK)
304e0 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  |.#endif.       
304f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
30500 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
30510 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
30520 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
30530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30540 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
30550 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
30560 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
30570 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30580 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
30590 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
305a0 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
305b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
305c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
305d0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
305e0 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
305f0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
30600 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30610 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
30620 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
30630 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30640 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
30650 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
30660 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
30670 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30680 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
30690 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
306a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
306b0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
306c0 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
306d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
306e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
306f0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
30700 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
30710 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
30720 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
30730 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
30740 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
30750 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a     ** it has a z
30760 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
30770 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
30780 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
30790 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
307a0 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
307b0 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
307c0 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
307d0 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
307e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
307f0 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
30800 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
30810 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
30820 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
30830 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
30840 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
30850 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
30860 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
30870 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
30880 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
30890 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
308a0 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
308b0 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
308c0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
308d0 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
308e0 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
308f0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
30900 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30910 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
30920 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
30930 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
30940 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
30950 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
30960 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
30970 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
30980 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30990 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
309a0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
309b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
309c0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
309d0 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
309e0 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
309f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
30a00 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
30a10 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
30a20 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61  gerGet() until a
30a30 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
30a40 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
30a50 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
30a60 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
30a70 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
30a80 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
30a90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
30aa0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
30ab0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
30ac0 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
30ad0 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
30ae0 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
30af0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
30b00 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
30b10 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
30b20 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
30b30 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
30b40 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
30b50 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
30b60 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
30b70 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
30b80 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
30b90 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
30ba0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
30bb0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
30bc0 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
30bd0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
30be0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
30bf0 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
30c00 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
30c10 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
30c20 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
30c30 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
30c40 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
30c50 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
30c60 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
30c70 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
30c80 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
30c90 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
30ca0 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
30cb0 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
30cc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30cd0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
30ce0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
30cf0 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
30d00 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
30d10 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
30d20 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
30d30 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
30d40 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
30d50 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
30d60 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
30d70 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
30d80 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
30d90 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
30da0 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
30db0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
30dc0 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
30dd0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
30de0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
30df0 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
30e00 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
30e10 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
30e20 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
30e30 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
30e40 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
30e50 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
30e60 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
30e70 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
30e80 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
30e90 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
30ea0 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
30eb0 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
30ec0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
30ed0 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
30ee0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
30ef0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
30f00 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
30f10 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
30f20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
30f30 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
30f40 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
30f50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30f70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
30f80 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
30f90 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
30fa0 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
30fb0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
30fc0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
30fd0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
30fe0 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
30ff0 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
31000 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
31010 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
31020 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
31030 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
31040 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
31050 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
31060 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
31070 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
31080 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
31090 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
310a0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
310b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
310c0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
310d0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
310e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
310f0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
31100 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
31110 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
31120 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d  );.  if( NEVER(M
31130 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
31140 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75  errCode) ){ retu
31150 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
31160 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61  de; }..  if( !pa
31170 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
31180 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  ) && pPager->eSt
31190 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
311a0 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a  ){.    int bHotJ
311b0 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20  ournal = 1;     
311c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
311d0 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68  there exists a h
311e0 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ot journal-file 
311f0 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
31200 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72  !MEMDB );..    r
31210 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
31220 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
31230 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
31240 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31250 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
31260 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
31270 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50  k==NO_LOCK || pP
31280 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
31290 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
312a0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
312b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
312c0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
312d0 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
312e0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
312f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
31300 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
31310 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
31320 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
31330 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
31340 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
31350 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
31360 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
31370 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  ){.      rc = ha
31380 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
31390 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c  er, &bHotJournal
313a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
313b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
313c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  {.      goto fai
313d0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
313e0 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  f( bHotJournal )
313f0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
31400 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
31410 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
31420 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
31430 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67  LBACK;.        g
31440 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31450 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
31460 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
31470 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
31480 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
31490 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
314a0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
314b0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
314c0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
314d0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
314e0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
314f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
31500 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
31510 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
31520 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
31530 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
31540 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
31550 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
31560 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
31570 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
31580 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
31590 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
315a0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
315b0 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
315c0 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
315d0 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
315e0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
315f0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
31600 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
31610 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
31620 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
31630 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
31640 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
31650 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
31660 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
31670 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
31680 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
31690 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
316a0 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
316b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
316c0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
316d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
316e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
316f0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
31700 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
31710 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
31720 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
31730 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
31740 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
31750 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
31760 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
31770 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31780 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
31790 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
317a0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
317b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
317c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
317d0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
317e0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
317f0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
31800 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
31810 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
31820 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
31830 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
31840 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
31850 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
31860 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
31870 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
31880 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
31890 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
318a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
318b0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
318c0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
318d0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
318e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
318f0 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
31900 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
31910 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
31920 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
31930 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
31940 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
31950 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
31960 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
31970 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
31980 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
31990 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
319a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
319b0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
319c0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
319d0 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
319e0 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
319f0 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
31a00 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
31a10 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
31a20 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
31a30 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
31a40 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
31a50 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
31a60 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
31a70 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
31a80 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
31a90 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
31aa0 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
31ab0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
31ac0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
31ad0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
31ae0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
31af0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
31b00 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
31b10 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31b20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
31b30 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
31b40 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
31b50 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
31b60 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
31b70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
31b80 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
31b90 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
31ba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
31bb0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
31bc0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
31bd0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
31be0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
31bf0 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
31c00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31c10 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
31c20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
31c30 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
31c40 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 0a 23        int f = .#
31c50 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
31c60 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
31c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
31c80 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53  ager->vfsFlags&S
31c90 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50  QLITE_OPEN_FILEP
31ca0 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c  ROTECTION_MASK)|
31cb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
31cc0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
31cd0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
31ce0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
31cf0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  AL;.          as
31d00 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
31d10 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
31d20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31d30 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
31d40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
31d50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
31d60 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
31d70 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
31d80 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
31d90 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
31da0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31db0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
31dc0 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
31dd0 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
31de0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31df0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
31e00 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
31e10 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
31e20 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
31e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31e40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20    }.      }. .  
31e50 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
31e60 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
31e70 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
31e80 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
31e90 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
31ea0 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
31eb0 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
31ec0 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
31ed0 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
31ee0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
31ef0 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
31f00 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
31f10 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
31f20 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
31f30 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20  ache.  Sync the 
31f40 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot journal befo
31f50 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20  re playing.     
31f60 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63   ** it back sinc
31f70 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  e the process th
31f80 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c  at crashed and l
31f90 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  eft the hot jour
31fa0 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  nal.      ** pro
31fb0 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79  bably did not sy
31fc0 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65  nc it and we are
31fd0 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77   required to alw
31fe0 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a  ays sync.      *
31ff0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  * the journal be
32000 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20  fore playing it 
32010 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  back..      */. 
32020 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
32030 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
32040 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
32060 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
32070 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
32080 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
32090 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
320a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
320b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
320c0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
320d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
320e0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
320f0 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ER_OPEN;.       
32100 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
32110 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
32120 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
32130 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b       pagerUnlock
32140 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
32150 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
32160 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ..      if( rc!=
32170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32180 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
32190 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20  nch is taken if 
321a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
321b0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
321c0 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
321d0 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68  or roll back a h
321e0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65  ot-journal while
321f0 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
32200 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
32210 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72          ** pager
32220 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  _unlock() routin
32230 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
32240 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
32250 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20  g to unlock.    
32260 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e      ** the file.
32270 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61   If the unlock a
32280 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68  ttempt fails, th
32290 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d  en Pager.eLock m
322a0 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
322b0 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  * set to UNKNOWN
322c0 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63  _LOCK (see the c
322d0 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
322e0 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20   #define for .  
322f0 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e        ** UNKNOWN
32300 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20  _LOCK above for 
32310 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e  an explanation).
32320 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
32330 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72       ** In order
32340 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e   to get pager_un
32350 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69  lock() to do thi
32360 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74  s, set Pager.eSt
32370 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ate to.        *
32380 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f  * PAGER_ERROR no
32390 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  w. This is not a
323a0 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20  ctually counted 
323b0 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a  as a transition.
323c0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52          ** to ER
323d0 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65  ROR state in the
323e0 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61   state diagram a
323f0 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69  t the top of thi
32400 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  s file,.        
32410 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
32420 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
32430 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
32440 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a  ock() will very.
32450 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74          ** short
32460 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68  ly transition th
32470 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74  e pager object t
32480 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  o the OPEN state
32490 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20  . Calling.      
324a0 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65    ** assert_page
324b0 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20  r_state() would 
324c0 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20  fail now, as it 
324d0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f  should not be po
324e0 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a  ssible.        *
324f0 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52  * to be in ERROR
32500 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72   state when ther
32510 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74  e are zero outst
32520 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20  anding page .   
32530 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63       ** referenc
32540 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
32550 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
32560 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
32570 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
32580 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
32590 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
325a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
325b0 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20  R_OPEN );.      
325c0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
325d0 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
325e0 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20  OCK).           
325f0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
32600 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
32610 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45  ger->eLock>SHARE
32620 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b  D_LOCK).      );
32630 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
32640 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
32650 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68 61 73  e && pPager->has
32660 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29  HeldSharedLock )
32670 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
32680 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
32690 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
326a0 64 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a  d then check to.
326b0 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
326c0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
326d0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
326e0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
326f0 20 68 61 73 20 63 68 61 6e 67 65 64 2c 0a 20 20   has changed,.  
32700 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65      ** flush the
32710 20 63 61 63 68 65 2e 20 20 54 68 65 20 68 61 73   cache.  The has
32720 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 66  HeldSharedLock f
32730 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 69  lag prevents thi
32740 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  s from.      ** 
32750 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65  occurring on the
32760 20 76 65 72 79 20 66 69 72 73 74 20 61 63 63 65   very first acce
32770 73 73 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e  ss to a file, in
32780 20 6f 72 64 65 72 20 74 6f 20 73 61 76 65 20 61   order to save a
32790 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
327a0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c   unnecessary sql
327b0 69 74 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c  ite3OsRead() cal
327c0 6c 20 61 74 20 74 68 65 20 73 74 61 72 74 2d 75  l at the start-u
327d0 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  p..      **.    
327e0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
327f0 61 6e 67 65 73 20 61 72 65 20 64 65 74 65 63 74  anges are detect
32800 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
32810 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
32820 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ing.      ** at 
32830 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74  offset 24 into t
32840 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69  he file.  The fi
32850 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31  rst 4 of these 1
32860 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  6 bytes are.    
32870 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
32880 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
32890 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
328a0 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
328b0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
328c0 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
328d0 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
328e0 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
328f0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65  .      ** a code
32900 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
32910 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
32920 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73  There is a vanis
32930 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61  hingly small cha
32940 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67  nce that a chang
32950 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20  e will not be . 
32960 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
32970 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
32980 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
32990 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
329a0 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  l that.      ** 
329b0 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
329c0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
329d0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d      Pgno nPage =
329e0 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64   0;.      char d
329f0 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
32a00 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
32a10 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63  ers)];..      rc
32a20 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
32a30 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
32a40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
32a50 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a  ) goto failed;..
32a60 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e        if( nPage>
32a70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54  0 ){.        IOT
32a80 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
32a90 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
32aa0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
32ab0 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  s)));.        rc
32ac0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
32ad0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
32ae0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
32af0 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
32b00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
32b10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
32b20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
32b30 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
32b40 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
32b50 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
32b60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32b70 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
32b80 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
32b90 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
32ba0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
32bb0 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
32bc0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
32bd0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
32be0 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
32bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
32c00 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
32c10 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d  ..        /* Unm
32c20 61 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ap the database 
32c30 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73  file. It is poss
32c40 69 62 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e  ible that extern
32c50 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20  al processes.   
32c60 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65       ** may have
32c70 20 74 72 75 6e 63 61 74 65 64 20 74 68 65 20 64   truncated the d
32c80 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
32c90 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69   then extended i
32ca0 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a  t back.        *
32cb0 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  * to its origina
32cc0 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69  l size while thi
32cd0 73 20 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f  s process was no
32ce0 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b  t holding a lock
32cf0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
32d00 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
32d10 6d 61 79 20 65 78 69 73 74 20 61 20 50 61 67 65  may exist a Page
32d20 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74  r.pMap mapping t
32d30 68 61 74 20 61 70 70 65 61 72 73 0a 20 20 20 20  hat appears.    
32d40 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65      ** to be the
32d50 20 72 69 67 68 74 20 73 69 7a 65 20 62 75 74 20   right size but 
32d60 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
32d70 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69  valid. Avoid thi
32d80 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73  s.        ** pos
32d90 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61  sibility by unma
32da0 70 70 69 6e 67 20 74 68 65 20 64 62 20 68 65 72  pping the db her
32db0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  e. */.        if
32dc0 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
32dd0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
32de0 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
32df0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
32e00 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
32e10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
32e20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
32e30 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68  a WAL file in th
32e40 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f  e file-system, o
32e50 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73  pen this databas
32e60 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20  e in WAL.    ** 
32e70 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  mode. Otherwise,
32e80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
32e90 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20  unction call is 
32ea0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a  a no-op..    */.
32eb0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
32ec0 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70  enWalIfPresent(p
32ed0 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20  Pager);.#ifndef 
32ee0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
32ef0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32f00 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72  er->pWal==0 || r
32f10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
32f20 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
32f30 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
32f40 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
32f50 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
32f60 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
32f70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
32f80 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
32f90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
32fa0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32fb0 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53  ER_OPEN && rc==S
32fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32fd0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
32fe0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61  unt(pPager, &pPa
32ff0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
33000 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
33010 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33020 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
33030 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67  MEMDB );.    pag
33040 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
33050 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
33060 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33070 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d  AGER_OPEN );.  }
33080 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
33090 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
330a0 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61  _READER;.    pPa
330b0 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
330c0 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  edLock = 1;.  }.
330d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
330e0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
330f0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
33100 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
33110 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
33120 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
33130 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
33140 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
33150 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
33160 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
33170 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
33180 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
33190 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
331a0 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
331b0 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
331c0 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
331d0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
331e0 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
331f0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
33200 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
33210 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
33220 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
33230 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
33240 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20  er->nMmapOut==0 
33250 26 26 20 28 73 71 6c 69 74 65 33 50 63 61 63 68  && (sqlite3Pcach
33260 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
33270 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29  ->pPCache)==0) )
33280 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  {.    pagerUnloc
33290 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
332a0 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
332b0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66  ** Acquire a ref
332c0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e  erence to page n
332d0 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61  umber pgno in pa
332e0 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61  ger pPager (a pa
332f0 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  ge.** reference 
33300 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a  has type DbPage*
33310 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ). If the reques
33320 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73  ted reference is
33330 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
33340 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69  y obtained, it i
33350 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50  s copied to *ppP
33360 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
33370 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
33380 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
33390 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  ed page is alrea
333a0 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  dy in the cache,
333b0 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
333c0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
333d0 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
333e0 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
333f0 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
33400 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66  h data.** read f
33410 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
33420 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63   file. In some c
33430 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65  ases, the pcache
33440 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63   module may.** c
33450 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c  hoose not to all
33460 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
33470 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20   object and may 
33480 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
33490 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68  g.** object with
334a0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
334b0 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
334c0 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61  * The extra data
334d0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
334e0 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
334f0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
33500 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  os the .** first
33510 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
33520 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
33530 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ry. If the page 
33540 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a  requested is .**
33550 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
33560 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20  cache when this 
33570 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
33580 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74  ed, then the ext
33590 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65  ra.** data is le
335a0 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ft as it was whe
335b0 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  n the page objec
335c0 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
335d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
335e0 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20  tabase image is 
335f0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
33600 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
33610 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d  or if a .** non-
33620 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61  zero value is pa
33630 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f  ssed as the noCo
33640 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ntent parameter 
33650 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  and the .** requ
33660 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
33670 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64  t already stored
33680 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74   in the cache, t
33690 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61  hen no .** actua
336a0 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75  l disk read occu
336b0 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
336c0 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
336d0 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  e of the .** pag
336e0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
336f0 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a   to all zeros. .
33700 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
33710 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
33720 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
33730 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
33740 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
33750 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73  f the page. This
33760 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73   occurs in two s
33770 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
33780 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
33790 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
337a0 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
337b0 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
337c0 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
337d0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
337e0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
337f0 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
33800 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
33810 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
33820 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c  cache to be fill
33830 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
33840 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
33850 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
33860 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
33870 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
33880 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
33890 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
338a0 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
338b0 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
338c0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
338d0 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
338e0 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
338f0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
33900 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
33910 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
33920 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
33930 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
33940 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
33950 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
33960 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
33970 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
33980 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
33990 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
339a0 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
339b0 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
339c0 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
339d0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
339e0 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
339f0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
33a00 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
33a10 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
33a20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
33a30 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
33a40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
33a50 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
33a60 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
33a70 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
33a80 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
33a90 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
33aa0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
33ab0 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
33ac0 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
33ad0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
33ae0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
33af0 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
33b00 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
33b10 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
33b20 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
33b30 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
33b40 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
33b50 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
33b60 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
33b70 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
33b80 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
33b90 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
33ba0 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
33bb0 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
33bc0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
33bd0 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
33be0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
33bf0 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
33c00 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
33c10 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
33c20 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
33c30 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
33c40 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
33c50 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
33c60 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
33c70 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
33c80 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
33c90 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
33ca0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
33cb0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
33cc0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
33cd0 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
33ce0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
33cf0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
33d00 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
33d10 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
33d20 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
33d30 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
33d40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
33d50 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
33d60 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
33d70 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
33d80 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
33d90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33da0 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20  ITE_OK;.  PgHdr 
33db0 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20  *pPg = 0;.  u32 
33dc0 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  iFrame = 0;     
33dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
33de0 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f  rame to read fro
33df0 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20  m WAL file */.  
33e00 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74  const int noCont
33e10 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ent = (flags & P
33e20 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
33e30 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  NT);..  /* It is
33e40 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75   acceptable to u
33e50 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28  se a read-only (
33e60 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61  mmap) page for a
33e70 6e 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20  ny page except. 
33e80 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68   ** page 1 if th
33e90 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d  ere is no write-
33ea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
33eb0 20 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f   or the ACQUIRE_
33ec0 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c  READONLY.  ** fl
33ed0 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64  ag was specified
33ee0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
33ef0 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74  And so long as t
33f00 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a  he db is not a .
33f10 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f    ** temporary o
33f20 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
33f30 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73  base.  */.  cons
33f40 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20  t int bMmapOk = 
33f50 28 70 67 6e 6f 3e 31 20 26 26 20 55 53 45 46 45  (pgno>1 && USEFE
33f60 54 43 48 28 70 50 61 67 65 72 29 0a 20 20 20 26  TCH(pPager).   &
33f70 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
33f80 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
33f90 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45  || (flags & PAGE
33fa0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29  R_GET_READONLY))
33fb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
33fc0 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70  AS_CODEC.   && p
33fd0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30  Pager->xCodec==0
33fe0 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20  .#endif.  );..  
33ff0 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  /* Optimization 
34000 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68  note:  Adding th
34010 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d  e "pgno<=1" term
34020 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30   before "pgno==0
34030 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  " here.  ** allo
34040 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  ws the compiler 
34050 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75  optimizer to reu
34060 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  se the results o
34070 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20  f the "pgno>1". 
34080 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20   ** test in the 
34090 70 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65  previous stateme
340a0 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65  nt, and avoid te
340b0 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e  sting pgno==0 in
340c0 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e   the.  ** common
340d0 20 63 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f   case where pgno
340e0 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20   is large. */.  
340f0 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70  if( pgno<=1 && p
34100 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
34110 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
34120 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
34130 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34140 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
34150 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
34160 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
34170 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
34180 20 20 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74    assert( noCont
34190 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f  ent==0 || bMmapO
341a0 6b 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65 72  k==0 );..  asser
341b0 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65  t( pPager->hasHe
341c0 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20  ldSharedLock==1 
341d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
341e0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
341f0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
34200 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
34210 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20  ediately. .  ** 
34220 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65  Otherwise, reque
34230 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  st the page from
34240 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65   the PCache laye
34250 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  r. */.  if( pPag
34260 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
34270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
34280 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
34290 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
342a0 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
342b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
342c0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
342d0 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
342e0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
342f0 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
34300 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
34310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
34320 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
34330 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
34340 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
34350 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  iFrame==0 ){.   
34360 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
34370 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   0;..      rc = 
34380 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70  sqlite3OsFetch(p
34390 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20  Pager->fd, .    
343a0 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f        (i64)(pgno
343b0 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
343c0 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e  geSize, pPager->
343d0 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61  pageSize, &pData
343e0 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
343f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34400 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20  OK && pData ){. 
34410 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
34420 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
34430 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20 20  READER ){.      
34440 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
34450 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
34460 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
34470 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
34480 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
34490 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
344a0 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70  AcquireMapPage(p
344b0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61  Pager, pgno, pDa
344c0 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20  ta, &pPg);.     
344d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
344e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
344f0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
34500 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70   (i64)(pgno-1)*p
34510 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
34520 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
34530 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
34540 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Pg ){.          
34550 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
34560 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
34570 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67     *ppPage = pPg
34580 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
34590 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
345a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
345b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
345c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
345d0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
345e0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
345f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a   }.    }..    {.
34600 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 63        sqlite3_pc
34610 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65  ache_page *pBase
34620 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20 3d 20  ;.      pBase = 
34630 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34640 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
34650 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  he, pgno, 3);.  
34660 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30      if( pBase==0
34670 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34680 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34690 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65 72  tchStress(pPager
346a0 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
346b0 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20   &pBase);.      
346c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
346d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
346e0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
346f0 20 20 20 20 20 20 69 66 28 20 70 42 61 73 65 3d        if( pBase=
34700 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
34710 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
34720 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
34730 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
34740 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
34750 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34760 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34770 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20    }.      pPg = 
34780 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65  *ppPage = sqlite
34790 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69  3PcacheFetchFini
347a0 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  sh(pPager->pPCac
347b0 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65 29  he, pgno, pBase)
347c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
347d0 70 50 67 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  pPg!=0 );.    }.
347e0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
347f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34800 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61  /* Either the ca
34810 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61  ll to sqlite3Pca
34820 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72  cheFetch() retur
34830 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20  ned an error or 
34840 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
34850 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20   was already in 
34860 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
34870 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
34880 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  on was called.. 
34890 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f     ** Set pPg to
348a0 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74   0 and jump to t
348b0 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e  he exception han
348c0 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50  dler.  */.    pP
348d0 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  g = 0;.    goto 
348e0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
348f0 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
34900 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20   pPg==(*ppPage) 
34910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
34920 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
34930 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
34940 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c  Pager==pPager ||
34950 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20   pPg->pPager==0 
34960 29 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  );..  if( pPg->p
34970 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74  Pager && !noCont
34980 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  ent ){.    /* In
34990 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
349a0 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f  cache already co
349b0 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61  ntains an initia
349c0 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20  lized copy of.  
349d0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52    ** the page. R
349e0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75  eturn without fu
349f0 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20  rther ado.  */. 
34a00 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
34a10 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  =PAGER_MAX_PGNO 
34a20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  && pgno!=PAGER_M
34a30 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
34a40 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
34a50 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48  tat[PAGER_STAT_H
34a60 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  IT]++;.    retur
34a70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
34a80 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
34a90 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
34aa0 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
34ab0 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
34ac0 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
34ad0 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
34ae0 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 2d  d.  */..    pPg-
34af0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
34b00 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
34b10 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
34b20 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
34b30 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
34b40 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
34b50 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
34b60 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
34b70 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
34b80 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
34b90 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
34ba0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
34bb0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
34bc0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
34bd0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
34be0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
34bf0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
34c00 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34c10 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
34c20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61  if( MEMDB || pPa
34c30 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f  ger->dbSize<pgno
34c40 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c   || noContent ||
34c50 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
34c60 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  >fd) ){.      if
34c70 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
34c80 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
34c90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
34ca0 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
34cb0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34cc0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
34cd0 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
34ce0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
34cf0 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
34d00 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
34d10 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
34d20 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
34d30 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
34d40 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
34d50 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
34d60 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
34d70 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
34d80 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
34d90 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
34da0 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
34db0 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
34dc0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
34dd0 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
34de0 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
34df0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
34e00 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
34e10 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
34e20 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
34e30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34e40 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
34e50 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
34e60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
34e70 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
34e80 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
34e90 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
34ea0 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
34eb0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
34ec0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
34ed0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
34ee0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
34ef0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34f00 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
34f10 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
34f20 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
34f30 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
34f40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
34f50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
34f60 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
34f70 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
34f80 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
34f90 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
34fa0 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
34fb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
34fc0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
34fd0 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
34fe0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
34ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
35000 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
35010 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f  Pager) && bMmapO
35020 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
35030 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
35040 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
35050 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
35060 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  rame);.        i
35070 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35080 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
35090 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
350a0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
350b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
350c0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
350d0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
350e0 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
350f0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
35100 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d  bPage(pPg, iFram
35110 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
35120 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35130 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
35140 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35150 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
35160 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
35170 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ash(pPg);.  }.. 
35180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
35190 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72  K;..pager_acquir
351a0 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28  e_err:.  assert(
351b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
351c0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
351d0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
351e0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Drop(pPg);.  }. 
351f0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
35200 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20  used(pPager);.. 
35210 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
35220 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
35230 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
35240 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
35250 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
35260 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
35270 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
35280 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
35290 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
352a0 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
352b0 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
352c0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
352d0 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  he. .**.** See a
352e0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
352f0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
35300 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
35310 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
35320 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
35330 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
35340 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
35350 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
35360 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
35370 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
35380 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
35390 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
353a0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
353b0 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
353c0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
353d0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
353e0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
353f0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
35400 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
35410 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
35420 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
35430 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gno){.  sqlite3_
35440 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61  pcache_page *pPa
35450 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
35460 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
35470 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
35480 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35490 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
354a0 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65    pPage = sqlite
354b0 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
354c0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
354d0 6e 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  no, 0);.  assert
354e0 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50  ( pPage==0 || pP
354f0 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
35500 72 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28  redLock );.  if(
35510 20 70 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75   pPage==0 ) retu
35520 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73  rn 0;.  return s
35530 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
35540 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
35550 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
35560 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
35570 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72  Release a page r
35580 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  eference..**.** 
35590 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
355a0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
355b0 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
355c0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
355d0 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
355e0 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
355f0 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
35600 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
35610 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
35620 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
35630 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
35640 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
35650 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
35660 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
35670 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
35680 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ll(DbPage *pPg){
35690 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
356a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ;.  assert( pPg!
356b0 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  =0 );.  pPager =
356c0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
356d0 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26  if( pPg->flags &
356e0 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20   PGHDR_MMAP ){. 
356f0 20 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d     pagerReleaseM
35700 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d  apPage(pPg);.  }
35710 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
35720 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
35730 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
35740 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
35750 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73  Pager);.}.void s
35760 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35770 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
35780 20 69 66 28 20 70 50 67 20 29 20 73 71 6c 69 74   if( pPg ) sqlit
35790 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
357a0 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ull(pPg);.}../*.
357b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
357c0 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
357d0 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
357e0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
357f0 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
35800 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
35810 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
35820 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
35830 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
35840 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
35850 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
35860 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
35870 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
35880 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
35890 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
358a0 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
358b0 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
358c0 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
358d0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
358e0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
358f0 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
35900 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
35910 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
35920 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35930 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
35940 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
35950 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
35960 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
35970 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
35980 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
35990 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
359a0 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
359b0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
359c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
359d0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
359e0 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
359f0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
35a00 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
35a10 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
35a20 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
35a30 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
35a40 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
35a50 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
35a60 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
35a70 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
35a80 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
35a90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
35aa0 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
35ab0 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
35ac0 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
35ad0 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
35ae0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
35af0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
35b00 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
35b10 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
35b20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
35b30 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
35b40 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
35b50 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
35b60 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
35b70 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
35b80 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
35b90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35ba0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
35bb0 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
35bc0 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
35bd0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
35be0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
35bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c00 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
35c10 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
35c20 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
35c30 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
35c40 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
35c50 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
35c60 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
35c70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35c80 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
35c90 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
35ca0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
35cb0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
35cc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35cd0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
35ce0 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
35cf0 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
35d00 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
35d10 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
35d20 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20  p.  But on.  ** 
35d30 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
35d40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
35d50 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20  never called if 
35d60 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
35d70 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
35d80 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
35d90 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
35da0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
35db0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
35dc0 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
35dd0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
35de0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
35df0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
35e00 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
35e10 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
35e20 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
35e30 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
35e40 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
35e50 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
35e60 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
35e70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35e80 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
35e90 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
35ea0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
35eb0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
35ec0 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20  dy open. */.    
35ed0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
35ee0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
35ef0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
35f00 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
35f10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
35f20 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ORY ){.        s
35f30 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
35f40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
35f50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
35f60 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
35f70 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
35f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
35f90 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
35fa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
35fb0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
35fc0 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
35fd0 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  ON.          (pP
35fe0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53  ager->vfsFlags&S
35ff0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50  QLITE_OPEN_FILEP
36000 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c  ROTECTION_MASK)|
36010 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
36020 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
36030 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
36040 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
36050 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74        (pPager->t
36060 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20  empFile ? .     
36070 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
36080 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
36090 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
360a0 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20  MP_JOURNAL):.   
360b0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
360c0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
360d0 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  AL).          );
360e0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72  ..        /* Ver
360f0 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74  ify that the dat
36100 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20  abase still has 
36110 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
36120 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20   it did when.   
36130 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f       ** it was o
36140 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64  riginally opened
36150 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  . */.        rc 
36160 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  = databaseIsUnmo
36170 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ved(pPager);.   
36180 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36190 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64 65 66  ITE_OK ){.#ifdef
361a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
361b0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
361c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
361d0 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
361e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66               pVf
361f0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
36200 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
36210 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
36220 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
36230 20 20 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c            );.#el
36240 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
36250 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
36260 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
36270 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
36280 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
36290 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
362a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
362b0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
362c0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
362d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
362e0 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f     }.  .  .    /
362f0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
36300 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
36310 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
36320 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
36330 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
36340 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
36350 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
36360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36370 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   ){.      /* TOD
36380 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20  O: Check if all 
36390 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61  of these are rea
363a0 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  lly required. */
363b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
363c0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Rec = 0;.      p
363d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
363e0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
363f0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
36400 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
36410 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
36420 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
36430 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
36440 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
36450 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
36460 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
36470 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
36480 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
36490 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
364a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
364b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
364c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
364d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
364e0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
364f0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
36500 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
36510 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20  CACHEMOD;.  }.. 
36520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
36530 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69  *.** Begin a wri
36540 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
36550 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
36560 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
36570 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61   a .** write-tra
36580 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
36590 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
365a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
365b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
365c0 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  * If the exFlag 
365d0 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
365e0 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
365f0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
36600 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  VED.** lock on t
36610 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36620 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  . If exFlag is t
36630 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  rue, then acquir
36640 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e  e at least.** an
36650 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
36660 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
36670 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
36680 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20   no locking .** 
36690 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62  functions need b
366a0 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  e called..**.** 
366b0 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
366c0 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
366d0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
366e0 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  ny sub-journal o
366f0 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  pened.** within 
36700 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
36710 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
36720 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
36730 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61  file. This.** ha
36740 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74  s no effect if t
36750 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
36760 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
36770 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77   (as it may be w
36780 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  hen.** running i
36790 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
367a0 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e  ) or if the tran
367b0 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  saction does not
367c0 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75   require a.** su
367d0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  b-journal. If th
367e0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
367f0 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c  rgument is zero,
36800 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
36810 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  ed.** sub-journa
36820 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l is implemented
36830 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50   in-memory if pP
36840 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65  ager is an in-me
36850 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a  mory database, .
36860 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65  ** or using a te
36870 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68  mporary file oth
36880 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
36890 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
368a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
368b0 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20  int exFlag, int 
368c0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20  subjInMemory){. 
368d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
368e0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
368f0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
36900 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
36910 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Code;.  assert( 
36920 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
36930 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
36940 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
36950 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
36960 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
36970 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49  mory = (u8)subjI
36980 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20  nMemory;..  if( 
36990 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65  ALWAYS(pPager->e
369a0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
369b0 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65  DER) ){.    asse
369c0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
369d0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20  ournal==0 );..  
369e0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
369f0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
36a00 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
36a10 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  er is configured
36a20 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f   to use locking_
36a30 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20  mode=exclusive, 
36a40 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20  and an.      ** 
36a50 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
36a60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
36a70 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65  s not already he
36a80 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f  ld, obtain it no
36a90 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  w..      */.    
36aa0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78    if( pPager->ex
36ab0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73  clusiveMode && s
36ac0 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
36ad0 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
36ae0 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  Wal, -1) ){.    
36af0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
36b00 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
36b10 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
36b20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
36b30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36b40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36b50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36b60 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57    (void)sqlite3W
36b70 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
36b80 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29  pPager->pWal, 1)
36b90 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
36ba0 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69   /* Grab the wri
36bb0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c  te lock on the l
36bc0 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
36bd0 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20  essful, upgrade 
36be0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  to.      ** PAGE
36bf0 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
36c00 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
36c10 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
36c20 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
36c30 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75  .      ** The bu
36c40 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f  sy-handler is no
36c50 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f  t invoked if ano
36c60 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
36c70 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
36c80 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65   holds the write
36c90 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62  -lock. If possib
36ca0 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  le, the upper la
36cb0 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74  yer will call it
36cc0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
36ce0 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61  BeginWriteTransa
36cf0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
36d00 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
36d10 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
36d20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
36d30 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36d40 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
36d50 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
36d60 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
36d70 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
36d80 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
36d90 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
36da0 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ck. The.      **
36db0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
36dc0 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
36dd0 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
36de0 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
36df0 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  VE.      ** lock
36e00 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
36e10 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
36e20 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
36e30 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
36e40 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
36e50 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
36e60 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
36e70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
36e80 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
36e90 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
36ea0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
36eb0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
36ec0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36ed0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
36ee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36ef0 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49  /* Change to WRI
36f00 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
36f10 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
36f20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74   ** WAL mode set
36f30 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  s Pager.eState t
36f40 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  o PAGER_WRITER_L
36f50 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f  OCKED or CACHEMO
36f60 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  D.      ** when 
36f70 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74  it has an open t
36f80 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
36f90 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f  never to DBMOD o
36fa0 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20  r FINISHED..    
36fb0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
36fc0 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74  ause in those st
36fd0 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
36fe0 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70   roll back savep
36ff0 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
37000 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20  ransactions may 
37010 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
37020 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
37030 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
37040 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
37050 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20  as well as into 
37060 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
37070 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
37080 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20  ncorrect in .   
37090 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a     ** WAL mode..
370a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
370b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
370c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
370d0 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65  KED;.      pPage
370e0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
370f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
37100 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
37110 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  FileSize = pPage
37120 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
37130 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
37140 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
37150 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
37160 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
37170 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   0;.    }..    a
37180 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
37190 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
371a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
371b0 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65  ADER );.    asse
371c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
371d0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
371e0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
371f0 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
37200 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
37210 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
37220 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  r) );.  }..  PAG
37230 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
37240 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
37250 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
37260 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37270 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65  /*.** Write page
37280 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e   pPg onto the en
37290 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  d of the rollbac
372a0 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  k journal..*/.st
372b0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
372c0 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41 64  LINE int pagerAd
372d0 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a  dPageToRollbackJ
372e0 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
372f0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
37300 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
37310 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  r;.  int rc;.  u
37320 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61 72  32 cksum;.  char
37330 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36 34 20   *pData2;.  i64 
37340 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  iOff = pPager->j
37350 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
37360 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
37370 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
37380 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
37390 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f  age that.  ** co
373a0 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
373b0 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
373c0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
373d0 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a 20 74   verifies.  ** t
373e0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
373f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
37400 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
37410 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
37420 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37430 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70  r->journalHdr<=p
37440 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37450 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28 70 50  f );.  CODEC2(pP
37460 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
37470 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
37480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
37490 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
374a0 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
374b0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
374c0 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a 20  )pData2);..  /* 
374d0 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
374e0 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
374f0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75  occurs while jou
37500 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 2a  rnalling the.  *
37510 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
37520 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
37530 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
37540 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
37550 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
37560 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
37570 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
37580 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
37590 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f  n.  ** playback_
375a0 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
375b0 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
375c0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
375d0 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69 6e  restored.  ** in
375e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
375f0 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
37600 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
37610 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
37620 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
37630 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
37640 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
37650 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
37660 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  YNC;..  rc = wri
37670 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
37680 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d  >jfd, iOff, pPg-
37690 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  >pgno);.  if( rc
376a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
376b0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
376c0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
376d0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
376e0 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
376f0 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20  Size, iOff+4);. 
37700 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37710 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37720 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
37730 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
37740 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  iOff+pPager->pag
37750 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b  eSize+4, cksum);
37760 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
37770 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
37780 3b 0a 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a  ;..  IOTRACE(("J
37790 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
377a0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
377b0 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
377c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
377d0 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
377e0 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 50  >pageSize));.  P
377f0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
37800 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
37810 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 54 52  ount);.  PAGERTR
37820 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE(("JOURNAL %d
37830 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
37840 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
37850 6e 22 2c 0a 20 20 20 20 20 20 20 50 41 47 45 52  n",.       PAGER
37860 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
37870 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 28  >pgno, .       (
37880 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
37890 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
378a0 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
378b0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 70 50 61  h(pPg)));..  pPa
378c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
378d0 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70  += 8 + pPager->p
378e0 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  ageSize;.  pPage
378f0 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61 73 73  r->nRec++;.  ass
37900 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
37910 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
37920 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
37930 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
37940 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
37950 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65  gno);.  testcase
37960 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
37970 45 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EM );.  assert( 
37980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
37990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
379a0 4d 20 29 3b 0a 20 20 72 63 20 7c 3d 20 61 64 64  M );.  rc |= add
379b0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
379c0 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
379d0 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
379e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
379f0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
37a00 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
37a10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
37a20 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70   a single data p
37a30 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
37a40 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72  . The page is wr
37a50 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
37a60 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ** main journal 
37a70 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61  or sub-journal a
37a80 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74  s required. If t
37a90 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
37aa0 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f  en into.** one o
37ab0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20  f the journals, 
37ac0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
37ad0 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
37ae0 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49  the .** Pager.pI
37af0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
37b00 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
37b10 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
37b20 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f  int bitvecs.** o
37b30 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70  f any open savep
37b40 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72  oints as appropr
37b50 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
37b60 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
37b70 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
37b80 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
37b90 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
37ba0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37bb0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
37bc0 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c  tine is not call
37bd0 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74  ed unless a writ
37be0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
37bf0 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20  s already .  ** 
37c00 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68  been started. Th
37c10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
37c20 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
37c30 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f   open at this po
37c40 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  int..  ** It is 
37c50 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
37c60 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
37c70 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
37c80 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37c90 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37ca0 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  KED.       || pP
37cb0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37cc0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
37cd0 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
37ce0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37cf0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
37d00 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
37d10 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37d20 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
37d30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37d40 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  errCode==0 );.  
37d50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37d60 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
37d70 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
37d80 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
37d90 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
37da0 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67  o be opened. Hig
37db0 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
37dc0 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  es have already.
37dd0 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68    ** obtained th
37de0 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b  e necessary lock
37df0 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77  s to begin the w
37e00 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
37e10 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72  , but the.  ** r
37e20 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
37e30 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65  might not yet be
37e40 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e   open. Open it n
37e50 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ow if this is th
37e60 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e case..  **.  *
37e70 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  * This is done b
37e80 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71  efore calling sq
37e90 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
37ea0 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61  irty() on the pa
37eb0 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ge. .  ** Otherw
37ec0 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65 20  ise, if it were 
37ed0 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69  done after calli
37ee0 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
37ef0 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65  MakeDirty(), the
37f00 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
37f10 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20  might occur and 
37f20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20  the pager would 
37f30 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45 52  end up in WRITER
37f40 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20  _LOCKED state.  
37f50 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d 61  ** with pages ma
37f60 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69 6e  rked as dirty in
37f70 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f   the cache..  */
37f80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
37f90 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37fa0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  TER_LOCKED ){.  
37fb0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
37fc0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
37fd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
37fe0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
37ff0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
38000 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
38010 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
38020 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61  _CACHEMOD );.  a
38030 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
38040 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
38050 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  ) );..  /* Mark 
38060 74 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73  the page that is
38070 20 61 62 6f 75 74 20 74 6f 20 62 65 20 6d 6f 64   about to be mod
38080 69 66 69 65 64 20 61 73 20 64 69 72 74 79 2e 20  ified as dirty. 
38090 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
380a0 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
380b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 72 6f 6c  ;..  /* If a rol
380c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 69 73  lback journal is
380d0 20 69 6e 20 75 73 65 2c 20 74 68 65 6d 20 6d 61   in use, them ma
380e0 6b 65 20 73 75 72 65 20 74 68 65 20 70 61 67 65  ke sure the page
380f0 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 0a 20   that is about. 
38100 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 69 73   ** to change is
38110 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
38120 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20   journal, or if 
38130 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6e 65  the page is a ne
38140 77 20 70 61 67 65 20 6f 66 66 0a 20 20 2a 2a 20  w page off.  ** 
38150 74 68 65 6e 20 65 6e 64 20 6f 66 20 74 68 65 20  then end of the 
38160 66 69 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  file, make sure 
38170 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
38180 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 2e  PGHDR_NEED_SYNC.
38190 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
381a0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
381b0 6e 61 6c 21 3d 30 29 20 3d 3d 20 69 73 4f 70 65  nal!=0) == isOpe
381c0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
381d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
381e0 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 0a 20 20  pInJournal!=0.  
381f0 20 26 26 20 73 71 6c 69 74 65 33 42 69 74 76 65   && sqlite3Bitve
38200 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 50 61  cTestNotNull(pPa
38210 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
38220 20 70 50 67 2d 3e 70 67 6e 6f 29 3d 3d 30 0a 20   pPg->pgno)==0. 
38230 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
38240 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
38250 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  er)==0 );.    if
38260 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  ( pPg->pgno<=pPa
38270 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
38280 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
38290 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c  gerAddPageToRoll
382a0 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 70 50 67 29  backJournal(pPg)
382b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
382c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
382d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
382e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
382f0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  e{.      if( pPa
38300 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
38310 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
38320 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
38330 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
38340 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
38350 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  }.      PAGERTRA
38360 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
38370 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
38380 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
38390 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
383a0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
383b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
383c0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
383d0 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
383e0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ));.    }.  }.. 
383f0 20 2f 2a 20 54 68 65 20 50 47 48 44 52 5f 44 49   /* The PGHDR_DI
38400 52 54 59 20 62 69 74 20 69 73 20 73 65 74 20 61  RTY bit is set a
38410 62 6f 76 65 20 77 68 65 6e 20 74 68 65 20 70 61  bove when the pa
38420 67 65 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  ge was added to 
38430 74 68 65 20 64 69 72 74 79 2d 6c 69 73 74 0a 20  the dirty-list. 
38440 20 2a 2a 20 61 6e 64 20 62 65 66 6f 72 65 20 77   ** and before w
38450 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20  riting the page 
38460 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
38470 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 61 69 74  k journal.  Wait
38480 20 75 6e 74 69 6c 20 6e 6f 77 2c 0a 20 20 2a 2a   until now,.  **
38490 20 61 66 74 65 72 20 74 68 65 20 70 61 67 65 20   after the page 
384a0 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
384b0 66 75 6c 6c 79 20 6a 6f 75 72 6e 61 6c 6c 65 64  fully journalled
384c0 2c 20 62 65 66 6f 72 65 20 73 65 74 74 69 6e 67  , before setting
384d0 20 74 68 65 0a 20 20 2a 2a 20 50 47 48 44 52 5f   the.  ** PGHDR_
384e0 57 52 49 54 45 41 42 4c 45 20 62 69 74 20 74 68  WRITEABLE bit th
384f0 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  at indicates tha
38500 74 20 74 68 65 20 70 61 67 65 20 63 61 6e 20 62  t the page can b
38510 65 20 73 61 66 65 6c 79 20 6d 6f 64 69 66 69 65  e safely modifie
38520 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66  d..  */.  pPg->f
38530 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 57 52  lags |= PGHDR_WR
38540 49 54 45 41 42 4c 45 3b 0a 20 20 0a 20 20 2f 2a  ITEABLE;.  .  /*
38550 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
38560 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
38570 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
38580 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a  s not in it,.  *
38590 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
385a0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73   page into the s
385b0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
385c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
385d0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
385e0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75  0 ){.    rc = su
385f0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65  bjournalPageIfRe
38600 71 75 69 72 65 64 28 70 50 67 29 3b 0a 20 20 7d  quired(pPg);.  }
38610 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
38620 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
38630 61 6e 64 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  and return. */. 
38640 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
38650 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
38660 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
38670 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
38680 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
38690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
386a0 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f 66 20  is a variant of 
386b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
386c0 65 28 29 20 74 68 61 74 20 72 75 6e 73 20 77 68  e() that runs wh
386d0 65 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  en the sector si
386e0 7a 65 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20  ze.** is larger 
386f0 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 73 69  than the page si
38700 7a 65 2e 20 20 53 51 4c 69 74 65 20 6d 61 6b 65  ze.  SQLite make
38710 73 20 74 68 65 20 28 72 65 61 73 6f 6e 61 62