/ Hex Artifact Content
Login

Artifact 4e8dc5bf9011a2a26e3ab18838f3c07d82e5d56c5bf177c5c11bfd63cdc2f429:


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 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
7150: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
7160: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
7170: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
7180: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
7190: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
71a0: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
71b0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
71c0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
71d0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
71e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
71f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7200: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
7210: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
7220: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75  values */.  u8 u
7230: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
7240: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
7250: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
7260: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
7270: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
72a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
72b0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
72c0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
72d0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
72e0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
72f0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
7300: 65 73 73 20 2a 2f 0a 20 20 75 38 20 65 78 74 72  ess */.  u8 extr
7310: 61 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  aSync;          
7320: 20 20 20 20 20 2f 2a 20 73 79 6e 63 20 64 69 72       /* sync dir
7330: 65 63 74 6f 72 79 20 61 66 74 65 72 20 6a 6f 75  ectory after jou
7340: 72 6e 61 6c 20 64 65 6c 65 74 65 20 2a 2f 0a 20  rnal delete */. 
7350: 20 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67   u8 ckptSyncFlag
7360: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
7370: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
7380: 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65  YNC_FULL for che
7390: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20  ckpoint */.  u8 
73a0: 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  walSyncFlags;   
73b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43           /* SYNC
73c0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
73d0: 46 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69  FULL for wal wri
73e0: 74 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63  tes */.  u8 sync
73f0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
7400: 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52       /* SYNC_NOR
7410: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
7420: 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
7430: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
7440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
7450: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
7460: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6d 6d 75 74  mporary or immut
7470: 61 62 6c 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  able file */.  u
7480: 38 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  8 noLock;       
7490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
74a0: 20 6e 6f 74 20 6c 6f 63 6b 20 28 65 78 63 65 70   not lock (excep
74b0: 74 20 69 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a  t in WAL mode) *
74c0: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74e0: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
74f0: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
7500: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7520: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
7530: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
7540: 4f 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a  O */..  /*******
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7590: 2a 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  ***.  ** The fol
75a0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e  lowing block con
75b0: 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73  tains those clas
75c0: 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 63  s members that c
75d0: 68 61 6e 67 65 20 64 75 72 69 6e 67 0a 20 20 2a  hange during.  *
75e0: 2a 20 72 6f 75 74 69 6e 65 20 6f 70 65 72 61 74  * routine operat
75f0: 69 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62  ion.  Class memb
7600: 65 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73 20  ers not in this 
7610: 62 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65 72  block are either
7620: 20 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e   fixed.  ** when
7630: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 66 69   the pager is fi
7640: 72 73 74 20 63 72 65 61 74 65 64 20 6f 72 20 65  rst created or e
7650: 6c 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20  lse only change 
7660: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 0a  when there is a.
7670: 20 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e 74    ** significant
7680: 20 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73 75   mode change (su
7690: 63 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20 74  ch as changing t
76a0: 68 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f  he page_size, lo
76b0: 63 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a  cking_mode,.  **
76c0: 20 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f   or the journal_
76d0: 6d 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f  mode).  From ano
76e0: 74 68 65 72 20 76 69 65 77 2c 20 74 68 65 73 65  ther view, these
76f0: 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64   class members d
7700: 65 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68 65  escribe.  ** the
7710: 20 22 73 74 61 74 65 22 20 6f 66 20 74 68 65 20   "state" of the 
7720: 70 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74 68  pager, while oth
7730: 65 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  er class members
7740: 20 64 65 73 63 72 69 62 65 20 74 68 65 0a 20 20   describe the.  
7750: 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f  ** "configuratio
7760: 6e 22 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  n" of the pager.
7770: 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61 74  .  */.  u8 eStat
7780: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7790: 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 61      /* Pager sta
77a0: 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45 52  te (OPEN, READER
77b0: 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e  , WRITER_LOCKED.
77c0: 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b  .) */.  u8 eLock
77d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
77e0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
77f0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74 61  ock held on data
7800: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
7810: 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  8 changeCountDon
7820: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
7830: 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e  t after incremen
7840: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
7850: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
7860: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
7870: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7880: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
7890: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
78a0: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20  to jrnl */.  u8 
78b0: 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20  doNotSpill;     
78c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
78d0: 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  ot spill the cac
78e0: 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f  he when non-zero
78f0: 20 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d   */.  u8 subjInM
7900: 65 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  emory;          
7910: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7920: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a   in-memory sub-j
7930: 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20  ournals */.  u8 
7940: 62 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20  bUseFetch;      
7950: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7960: 20 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29   to use xFetch()
7970: 20 2a 2f 0a 20 20 75 38 20 68 61 73 48 65 6c 64   */.  u8 hasHeld
7980: 53 68 61 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20  SharedLock;     
7990: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 73    /* True if a s
79a0: 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 65  hared lock has e
79b0: 76 65 72 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f  ver been held */
79c0: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
79f0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7a00: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7a10: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
7a20: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
7a30: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
7a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
7a50: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
7a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7a70: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7a80: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7a90: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7aa0: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7ab0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7ac0: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7ad0: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7ae0: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b00: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7b10: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
7b20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
7b50: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
7b60: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
7b70: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7b80: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7b90: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7ba0: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7bb0: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7bc0: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7bd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7be0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7bf0: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7c00: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7c10: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
7c20: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
7c30: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
7c40: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
7c50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7c60: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7c70: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7c80: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7c90: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7ca0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7cb0: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7cc0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7cd0: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7ce0: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7cf0: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7d00: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7d10: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7d20: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7d30: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7d40: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7d50: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7d60: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7d70: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7d80: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7d90: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7da0: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7db0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7dc0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7dd0: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7de0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7df0: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7e00: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7e10: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7e20: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7e30: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7e40: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7e50: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7e60: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7e70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7e80: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7e90: 6e 74 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44  nt[] */.  u32 iD
7ea0: 61 74 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20  ataVersion;     
7eb0: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7ec0: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7ed0: 73 65 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67  se content chang
7ee0: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  es */.  char dbF
7ef0: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
7f00: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
7f10: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
7f20: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
7f30: 0a 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74  ..  int nMmapOut
7f40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7f50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61  /* Number of mma
7f60: 70 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  p pages currentl
7f70: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f  y outstanding */
7f80: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
7f90: 20 73 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f   szMmap;       /
7fa0: 2a 20 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75  * Desired maximu
7fb0: 6d 20 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20  m mmap size */. 
7fc0: 20 50 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65   PgHdr *pMmapFre
7fd0: 65 6c 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20  elist;       /* 
7fe0: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61  List of free mma
7ff0: 70 20 70 61 67 65 20 68 65 61 64 65 72 73 20 28  p page headers (
8000: 70 44 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a  pDirty) */.  /*.
8010: 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    ** End of the 
8020: 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69  routinely-changi
8030: 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  ng class members
8040: 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  *************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
8090: 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20  .  u16 nExtra;  
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
80b0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
80c0: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
80d0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
80e0: 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20    i16 nReserve; 
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8100: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
8110: 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f  d bytes at end o
8120: 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  f each page */. 
8130: 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20   u32 vfsFlags;  
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8150: 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  Flags for sqlite
8160: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
8170: 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a  .  u32 sectorSiz
8180: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
8190: 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72  * Assumed sector
81a0: 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c   size during rol
81b0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  lback */.  int p
81c0: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
81d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
81e0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70   of bytes in a p
81f0: 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  age */.  Pgno mx
8200: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
8210: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
8220: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
8230: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
8240: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
8250: 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  eLimit;       /*
8260: 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20   Size limit for 
8270: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
8280: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68  al files */.  ch
8290: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
82a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
82b0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
82c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
82d0: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
82e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
82f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
8300: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ile */.  int (*x
8310: 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
8320: 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  d*); /* Function
8330: 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75   to call when bu
8340: 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  sy */.  void *pB
8350: 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20  usyHandlerArg;  
8360: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61      /* Context a
8370: 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73  rgument for xBus
8380: 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e  yHandler */.  in
8390: 74 20 61 53 74 61 74 5b 33 5d 3b 20 20 20 20 20  t aStat[3];     
83a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
83b0: 61 6c 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d  al cache hits, m
83c0: 69 73 73 65 73 20 61 6e 64 20 77 72 69 74 65 73  isses and writes
83d0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
83e0: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65  E_TEST.  int nRe
83f0: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
8400: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
8410: 20 70 61 67 65 73 20 72 65 61 64 20 2a 2f 0a 23   pages read */.#
8420: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
8430: 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65  Reiniter)(DbPage
8440: 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  *); /* Call this
8450: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
8460: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
8470: 0a 20 20 69 6e 74 20 28 2a 78 47 65 74 29 28 50  .  int (*xGet)(P
8480: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
8490: 65 2a 2a 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  e**,int); /* Rou
84a0: 74 69 6e 65 20 74 6f 20 66 65 74 63 68 20 61 20  tine to fetch a 
84b0: 70 61 74 63 68 20 2a 2f 0a 23 69 66 64 65 66 20  patch */.#ifdef 
84c0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
84d0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
84e0: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
84f0: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8500: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
8510: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
8520: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
8530: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
8540: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
8550: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
8560: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
8570: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
8580: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
8590: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
85a0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
85b0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
85d0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
85e0: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
85f0: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8600: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
8610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8620: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
8630: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
8640: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
8650: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
8660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
8670: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
8680: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
8690: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
86a0: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
86b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
86c0: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
86d0: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
86e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
86f0: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8700: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8710: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
8720: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
8730: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  log */.#endif.#i
8740: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56  fdef SQLITE_SERV
8750: 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 53 65 72  ER_EDITION.  Ser
8760: 76 65 72 20 2a 70 53 65 72 76 65 72 3b 0a 20 20  ver *pServer;.  
8770: 53 65 72 76 65 72 50 61 67 65 20 2a 70 53 65 72  ServerPage *pSer
8780: 76 65 72 50 61 67 65 3b 0a 23 65 6e 64 69 66 0a  verPage;.#endif.
8790: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65  };../*.** Indexe
87a0: 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 50  s for use with P
87b0: 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68  ager.aStat[]. Th
87c0: 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20  e Pager.aStat[] 
87d0: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  array contains.*
87e0: 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63 63  * the values acc
87f0: 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e 67  essed by passing
8800: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
8810: 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48  _CACHE_HIT, CACH
8820: 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41  E_MISS .** or CA
8830: 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c  CHE_WRITE to sql
8840: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29  ite3_db_status()
8850: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
8860: 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a  ER_STAT_HIT   0.
8870: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8880: 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69  AT_MISS  1.#defi
8890: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52  ne PAGER_STAT_WR
88a0: 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ITE 2../*.** The
88b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
88c0: 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  l variables hold
88d0: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66   counters used f
88e0: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75  or.** testing pu
88f0: 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68  rposes only.  Th
8900: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f  ese variables do
8910: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a   not exist in.**
8920: 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62   a non-testing b
8930: 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72  uild.  These var
8940: 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74  iables are not t
8950: 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23  hread-safe..*/.#
8960: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8970: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  T.int sqlite3_pa
8980: 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
8990: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
89a0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
89b0: 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f   read from DB */
89c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
89d0: 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
89e0: 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
89f0: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
8a00: 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f  written to DB */
8a10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
8a20: 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20  er_writej_count 
8a30: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
8a40: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
8a50: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
8a60: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8a70: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
8a80: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
8a90: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
8aa0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  ..../*.** Journa
8ab0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
8ac0: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
8ad0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
8ae0: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
8af0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
8b00: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
8b10: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
8b20: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
8b30: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
8b40: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
8b50: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8b60: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
8b70: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
8b80: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
8b90: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
8ba0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
8bb0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a  ournal is being.
8bc0: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
8bd0: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
8be0: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
8bf0: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
8c00: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
8c10: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
8c20: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
8c30: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
8c40: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
8c50: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
8c60: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
8c70: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
8c80: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
8c90: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
8ca0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
8cb0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
8cc0: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
8cd0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
8ce0: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
8cf0: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
8d00: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8d10: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
8d20: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
8d30: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
8d40: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
8d50: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
8d60: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
8d70: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
8d80: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
8d90: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
8da0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8db0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
8dc0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
8dd0: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
8de0: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
8df0: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
8e00: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
8e10: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
8e20: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
8e30: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
8e40: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
8e50: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
8e60: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
8e70: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
8e80: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
8e90: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
8ea0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
8eb0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
8ec0: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
8ed0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
8ee0: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
8ef0: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
8f00: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
8f10: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
8f20: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
8f30: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
8f40: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
8f50: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
8f60: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
8f70: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
8f80: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
8f90: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
8fa0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
8fb0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
8fc0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8fd0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
8fe0: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
8ff0: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
9000: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
9010: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
9020: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
9030: 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65  the of each page
9040: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a   record in the j
9050: 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20  ournal is given 
9060: 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  by.** the follow
9070: 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64  ing macro..*/.#d
9080: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
9090: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
90a0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
90b0: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
90c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
90d0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
90e0: 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75  ger. This is usu
90f0: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a  ally the same .*
9100: 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67  * size as a sing
9110: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
9120: 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74  See also setSect
9130: 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65  orSize()..*/.#de
9140: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
9150: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
9160: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
9170: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
9180: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
9190: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
91a0: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
91b0: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
91c0: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
91d0: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
91e0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
91f0: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
9200: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
9210: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
9220: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
9230: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
9240: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
9250: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
9260: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
9270: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
9280: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
9290: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
92a0: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
92b0: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
92c0: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
92d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
92e0: 6f 20 55 53 45 46 45 54 43 48 20 69 73 20 74 72  o USEFETCH is tr
92f0: 75 65 20 69 66 20 77 65 20 61 72 65 20 61 6c 6c  ue if we are all
9300: 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  owed to use the 
9310: 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e 66 65  xFetch and xUnfe
9320: 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  tch.** interface
9330: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
9340: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 6d  database using m
9350: 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f  emory-mapped I/O
9360: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
9370: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
9380: 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43  # define USEFETC
9390: 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73 65 46  H(x) ((x)->bUseF
93a0: 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20 64 65  etch).#else.# de
93b0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
93c0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
93d0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
93e0: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
93f0: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
9400: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
9410: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
9420: 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  47../*.** The ar
9430: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
9440: 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64  acro is a file d
9450: 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65 20  escriptor (type 
9460: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a  sqlite3_file*)..
9470: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
9480: 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  t is not open, o
9490: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20  r non-zero (but 
94a0: 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e  not 1) if it is.
94b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
94c0: 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  o that expressio
94d0: 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ns can be writte
94e0: 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  n as:.**.**   if
94f0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
9500: 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a  >jfd) ){ ....**.
9510: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ** instead of.**
9520: 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65 72  .**   if( pPager
9530: 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
9540: 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ){ ....*/.#defin
9550: 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28  e isOpen(pFd) ((
9560: 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 21 3d  pFd)->pMethods!=
9570: 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  0)../*.** Return
9580: 20 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61   true if this pa
9590: 67 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65  ger uses a write
95a0: 2d 61 68 65 61 64 20 6c 6f 67 20 74 6f 20 72 65  -ahead log to re
95b0: 61 64 20 70 61 67 65 20 70 67 6e 6f 2e 0a 2a 2a  ad page pgno..**
95c0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
95d0: 20 74 68 65 20 70 61 67 65 72 20 72 65 61 64 73   the pager reads
95e0: 20 70 67 6e 6f 20 64 69 72 65 63 74 6c 79 20 66   pgno directly f
95f0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
9600: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
9610: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
9620: 4c 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  L) && defined(SQ
9630: 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
9640: 46 4c 4f 57 5f 52 45 41 44 29 0a 69 6e 74 20 73  FLOW_READ).int s
9650: 71 6c 69 74 65 33 50 61 67 65 72 55 73 65 57 61  qlite3PagerUseWa
9660: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
9670: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 75   Pgno pgno){.  u
9680: 33 32 20 69 52 65 61 64 20 3d 20 30 3b 0a 20 20  32 iRead = 0;.  
9690: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
96a0: 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 29 20  ager->pWal==0 ) 
96b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
96c0: 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
96d0: 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
96e0: 6c 2c 20 70 67 6e 6f 2c 20 26 69 52 65 61 64 29  l, pgno, &iRead)
96f0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 7c 7c  ;.  return rc ||
9700: 20 69 52 65 61 64 3b 0a 7d 0a 23 65 6e 64 69 66   iRead;.}.#endif
9710: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9720: 4f 4d 49 54 5f 57 41 4c 0a 23 20 64 65 66 69 6e  OMIT_WAL.# defin
9730: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
9740: 20 28 28 78 29 2d 3e 70 57 61 6c 21 3d 30 29 0a   ((x)->pWal!=0).
9750: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
9760: 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a  agerUseWal(x) 0.
9770: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f  # define pagerRo
9780: 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23  llbackWal(x) 0.#
9790: 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c   define pagerWal
97a0: 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20  Frames(v,w,x,y) 
97b0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
97c0: 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
97d0: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (z) SQLITE_OK.# 
97e0: 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69  define pagerBegi
97f0: 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
9800: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (z) SQLITE_OK.#e
9810: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
9820: 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49  ITE_SERVER_EDITI
9830: 4f 4e 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  ON.# define page
9840: 72 49 73 53 65 72 76 65 72 28 78 29 20 28 28 78  rIsServer(x) ((x
9850: 29 2d 3e 70 53 65 72 76 65 72 21 3d 30 29 0a 23  )->pServer!=0).#
9860: 20 64 65 66 69 6e 65 20 70 61 67 65 72 49 73 50   define pagerIsP
9870: 72 6f 63 65 73 73 53 65 72 76 65 72 28 78 29 20  rocessServer(x) 
9880: 73 71 6c 69 74 65 33 53 65 72 76 65 72 49 73 53  sqlite3ServerIsS
9890: 69 6e 67 6c 65 50 72 6f 63 65 73 73 28 28 78 29  ingleProcess((x)
98a0: 2d 3e 70 53 65 72 76 65 72 29 0a 23 65 6c 73 65  ->pServer).#else
98b0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 49  .# define pagerI
98c0: 73 53 65 72 76 65 72 28 78 29 20 30 0a 23 65 6e  sServer(x) 0.#en
98d0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
98e0: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BUG ./*.** Usage
98f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
9900: 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
9910: 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
9920: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9930: 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73  ion runs many as
9940: 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20  serts to try to 
9950: 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e  find inconsisten
9960: 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69  cies in.** the i
9970: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
9980: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
9990: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
99a0: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
99b0: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
99c0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
99d0: 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   p;..  /* State 
99e0: 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a  must be valid. *
99f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  /.  assert( p->e
9a00: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
9a10: 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  N.       || p->e
9a20: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
9a30: 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DER.       || p-
9a40: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9a50: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
9a60: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9a70: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
9a80: 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
9a90: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9aa0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
9ab0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9ac0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9ad0: 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20  R_FINISHED.     
9ae0: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9af0: 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
9b00: 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73  ..  /* Regardles
9b10: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
9b20: 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66   state, a temp-f
9b30: 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ile connection a
9b40: 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20  lways behaves.  
9b50: 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20  ** as if it has 
9b60: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
9b70: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
9b80: 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72  e file. It never
9b90: 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68   updates.  ** th
9ba0: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
9bb0: 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63   field, so the c
9bc0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
9bd0: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
9be0: 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
9bf0: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
9c00: 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58   || p->eLock==EX
9c10: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
9c20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
9c30: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
9c40: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9c50: 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  one );..  /* If 
9c60: 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66  the useJournal f
9c70: 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
9c80: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d  e journal-mode m
9c90: 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20  ust be "OFF". . 
9ca0: 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a   ** And if the j
9cb0: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22  ournal-mode is "
9cc0: 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61  OFF", the journa
9cd0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20  l file must not 
9ce0: 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  be open..  */.  
9cf0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9d00: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9d10: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9d20: 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29   p->useJournal )
9d30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  ;.  assert( p->j
9d40: 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
9d50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9d60: 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e  F || !isOpen(p->
9d70: 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  jfd) );..  /* Ch
9d80: 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69  eck that MEMDB i
9d90: 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41  mplies noSync. A
9da0: 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nd an in-memory 
9db0: 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a  journal. Since .
9dc0: 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73 20    ** this means 
9dd0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
9de0: 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49  er performs no I
9df0: 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e  O at all, it can
9e00: 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20  not encounter . 
9e10: 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49 54   ** either SQLIT
9e20: 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
9e30: 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f  E_FULL during ro
9e40: 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65 20  llback or while 
9e50: 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a  finalizing .  **
9e60: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
9e70: 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20 69   (although the i
9e80: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9e90: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
9ea0: 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e  may .  ** return
9eb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
9ec0: 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  MEM while the jo
9ed0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
9ee0: 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49 74  ing written). It
9ef0: 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66   .  ** is theref
9f00: 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  ore not possible
9f10: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
9f20: 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  y pager to enter
9f30: 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a   the ERROR .  **
9f40: 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
9f50: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
9f60: 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
9f70: 70 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 61 73  p->fd) );.    as
9f80: 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20  sert( p->noSync 
9f90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9fa0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9fb0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9fc0: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c  _OFF .         |
9fd0: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
9fe0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9ff0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
a000: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a010: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
a020: 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61  ERROR && p->eSta
a030: 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
a040: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
a050: 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20  gerUseWal(p)==0 
a060: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
a070: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
a080: 69 73 20 73 65 74 2c 20 61 20 52 45 53 45 52 56  is set, a RESERV
a090: 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ED lock or great
a0a0: 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  er must be held.
a0b0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65    ** on the file
a0c0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
a0d0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
a0e0: 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70  ountDone==0 || p
a0f0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45  Pager->eLock>=RE
a100: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
a110: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a120: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
a130: 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d  );..  switch( p-
a140: 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63  >eState ){.    c
a150: 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a  ase PAGER_OPEN:.
a160: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d        assert( !M
a170: 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73  EMDB );.      as
a180: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a190: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a1a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a1b0: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a1c0: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a1d0: 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70  pPCache)==0 || p
a1e0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
a1f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a200: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a210: 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73  READER:.      as
a220: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a230: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a240: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a250: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
a260: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
a270: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a280: 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
a290: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a2a0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a2b0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20  WRITER_LOCKED:. 
a2c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a2d0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
a2e0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a2f0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a300: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a310: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61  );.      if( !pa
a320: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a330: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
a340: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
a350: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a370: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a380: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a390: 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20  OrigSize );.    
a3a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a3b0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
a3c0: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
a3d0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a3e0: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a3f0: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a400: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
a410: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a420: 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
a430: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a440: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a450: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a  RITER_CACHEMOD:.
a460: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a470: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
a480: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a490: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a4a0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a4b0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
a4c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a4d0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
a4e0: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
a4f0: 74 68 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f  that if journal_
a500: 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68  mode=wal here th
a510: 61 74 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20  at neither the. 
a520: 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
a530: 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57  l file nor the W
a540: 41 4c 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e  AL file are open
a550: 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 64  . This happens d
a560: 75 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  uring.        **
a570: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e   a rollback tran
a580: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69  saction that swi
a590: 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e  tches from journ
a5a0: 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20  al_mode=off.    
a5b0: 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61      ** to journa
a5c0: 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20  l_mode=wal..    
a5d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
a5e0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a5f0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
a600: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a610: 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29  ( isOpen(p->jfd)
a620: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
a630: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a640: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a650: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a660: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a670: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a680: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
a690: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
a6a0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
a6b0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a6c0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a6d0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a6e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a6f0: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a700: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a710: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a720: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a730: 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20  WRITER_DBMOD:.  
a740: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a750: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a760: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a770: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a780: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a790: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a7a0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a7b0: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a7c0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a7d0: 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  >=EXCLUSIVE_LOCK
a7e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a7f0: 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29  ( isOpen(p->jfd)
a800: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a810: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a820: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a830: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a840: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a850: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a860: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
a870: 20 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74         || (sqlit
a880: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
a890: 74 65 72 69 73 74 69 63 73 28 70 2d 3e 66 64 29  teristics(p->fd)
a8a0: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41  &SQLITE_IOCAP_BA
a8b0: 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 20 20  TCH_ATOMIC).    
a8c0: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
a8d0: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a8e0: 67 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64  gSize<=pPager->d
a8f0: 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  bHintSize );.   
a900: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a910: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
a920: 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20  _FINISHED:.     
a930: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a940: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
a950: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a960: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a970: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a980: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
a990: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
a9a0: 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  er) );.      ass
a9b0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a9c0: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a9d0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a9e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a9f0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
aa00: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
aa10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aa20: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
aa30: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 71            || (sq
aa40: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
aa50: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e  racteristics(p->
aa60: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
aa70: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20  _BATCH_ATOMIC). 
aa80: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72       );.      br
aa90: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
aaa0: 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20  AGER_ERROR:.    
aab0: 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20    /* There must 
aac0: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
aad0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
aae0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
aaf0: 65 72 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69  er if.      ** i
ab00: 6e 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f  n ERROR state. O
ab10: 74 68 65 72 77 69 73 65 20 74 68 65 20 70 61 67  therwise the pag
ab20: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  er should have a
ab30: 6c 72 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20  lready dropped. 
ab40: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20       ** back to 
ab50: 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20  OPEN state..    
ab60: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
ab70: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
ab80: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
ab90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
aba0: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
abb0: 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
abc0: 61 63 68 65 29 3e 30 20 7c 7c 20 70 50 61 67 65  ache)>0 || pPage
abd0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
abe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
abf0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
ac00: 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
ac10: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
ac20: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a  f SQLITE_DEBUG .
ac30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
ac40: 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61  ointer to a huma
ac50: 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e  n readable strin
ac60: 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75  g in a static bu
ac70: 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
ac80: 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ng the state of 
ac90: 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
aca0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
acb0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20  gument. This.** 
acc0: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
acd0: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65  e used within de
ace0: 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61  buggers. For exa
acf0: 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65  mple, as an alte
ad00: 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70  rnative.** to "p
ad10: 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e  rint *pPager" in
ad20: 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62   gdb:.**.** (gdb
ad30: 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70  ) printf "%s", p
ad40: 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65  rint_pager_state
ad50: 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74  (pPager).*/.stat
ad60: 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70  ic char *print_p
ad70: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
ad80: 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *p){.  static c
ad90: 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a  har zRet[1024];.
ada0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
adb0: 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a  ntf(1024, zRet,.
adc0: 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a        "Filename:
add0: 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20        %s\n".    
ade0: 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20    "State:       
adf0: 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c    %s errCode=%d\
ae00: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20  n".      "Lock: 
ae10: 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20           %s\n". 
ae20: 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f       "Locking mo
ae30: 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  de:  locking_mod
ae40: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a  e=%s\n".      "J
ae50: 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f  ournal mode:  jo
ae60: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22  urnal_mode=%s\n"
ae70: 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20  .      "Backing 
ae80: 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d  store: tempFile=
ae90: 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a  %d memDb=%d useJ
aea0: 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20  ournal=%d\n".   
aeb0: 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20     "Journal:    
aec0: 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c     journalOff=%l
aed0: 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c  ld journalHdr=%l
aee0: 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a  ld\n".      "Siz
aef0: 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69  e:          dbsi
af00: 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65  ze=%d dbOrigSize
af10: 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25  =%d dbFileSize=%
af20: 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  d\n".      , p->
af30: 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20  zFilename.      
af40: 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  , p->eState==PAG
af50: 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20  ER_OPEN         
af60: 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20     ? "OPEN" :.  
af70: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
af80: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20  =PAGER_READER   
af90: 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52         ? "READER
afa0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
afb0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
afc0: 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22  TER_LOCKED   ? "
afd0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a  WRITER_LOCKED" :
afe0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
aff0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
b000: 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49  _CACHEMOD ? "WRI
b010: 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a  TER_CACHEMOD" :.
b020: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
b030: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
b040: 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54  DBMOD    ? "WRIT
b050: 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20  ER_DBMOD" :.    
b060: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b070: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
b080: 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46  SHED ? "WRITER_F
b090: 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20  INISHED" :.     
b0a0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b0b0: 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20  GER_ERROR       
b0c0: 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20      ? "ERROR" : 
b0d0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b0e0: 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64  , (int)p->errCod
b0f0: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f  e.      , p->eLo
b100: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  ck==NO_LOCK     
b110: 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20      ? "NO_LOCK" 
b120: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
b130: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
b140: 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22  K   ? "RESERVED"
b150: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
b160: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
b170: 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56  OCK  ? "EXCLUSIV
b180: 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  E" :.        p->
b190: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
b1a0: 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44  CK     ? "SHARED
b1b0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
b1c0: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
b1d0: 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e  CK    ? "UNKNOWN
b1e0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
b1f0: 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69      , p->exclusi
b200: 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73  veMode ? "exclus
b210: 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a  ive" : "normal".
b220: 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e        , p->journ
b230: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
b240: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
b250: 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a     ? "memory" :.
b260: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
b270: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
b280: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
b290: 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20     ? "off" :.   
b2a0: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
b2b0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
b2c0: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
b2d0: 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20  ? "delete" :.   
b2e0: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
b2f0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
b300: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
b310: 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20  ? "persist" :.  
b320: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
b330: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b340: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
b350: 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a   ? "truncate" :.
b360: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
b370: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
b380: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
b390: 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65     ? "wal" : "?e
b3a0: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28  rror?".      , (
b3b0: 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c  int)p->tempFile,
b3c0: 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20   (int)p->memDb, 
b3d0: 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e  (int)p->useJourn
b3e0: 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  al.      , p->jo
b3f0: 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75  urnalOff, p->jou
b400: 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20  rnalHdr.      , 
b410: 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20  (int)p->dbSize, 
b420: 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69  (int)p->dbOrigSi
b430: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69  ze, (int)p->dbFi
b440: 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72  leSize.  );..  r
b450: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
b460: 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ndif../* Forward
b470: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
b480: 68 65 20 76 61 72 69 6f 75 73 20 70 61 67 65 20  he various page 
b490: 67 65 74 74 65 72 73 20 2a 2f 0a 73 74 61 74 69  getters */.stati
b4a0: 63 20 69 6e 74 20 67 65 74 50 61 67 65 4e 6f 72  c int getPageNor
b4b0: 6d 61 6c 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c  mal(Pager*,Pgno,
b4c0: 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 73  DbPage**,int);.s
b4d0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
b4e0: 65 45 72 72 6f 72 28 50 61 67 65 72 2a 2c 50 67  eError(Pager*,Pg
b4f0: 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29  no,DbPage**,int)
b500: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
b510: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
b520: 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d  tic int getPageM
b530: 4d 61 70 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c  Map(Pager*,Pgno,
b540: 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23  DbPage**,int);.#
b550: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  endif../*.** Set
b560: 20 74 68 65 20 50 61 67 65 72 2e 78 47 65 74 20   the Pager.xGet 
b570: 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 65 20 61  method for the a
b580: 70 70 72 6f 70 72 69 61 74 65 20 72 6f 75 74 69  ppropriate routi
b590: 6e 65 20 75 73 65 64 20 74 6f 20 66 65 74 63 68  ne used to fetch
b5a0: 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  .** content from
b5b0: 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 73   the pager..*/.s
b5c0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 47 65  tatic void setGe
b5d0: 74 74 65 72 4d 65 74 68 6f 64 28 50 61 67 65 72  tterMethod(Pager
b5e0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
b5f0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
b600: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b610: 78 47 65 74 20 3d 20 67 65 74 50 61 67 65 45 72  xGet = getPageEr
b620: 72 6f 72 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ror;.#if SQLITE_
b630: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
b640: 20 20 7d 65 6c 73 65 20 69 66 28 20 55 53 45 46    }else if( USEF
b650: 45 54 43 48 28 70 50 61 67 65 72 29 0a 23 69 66  ETCH(pPager).#if
b660: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45  def SQLITE_SERVE
b670: 52 5f 45 44 49 54 49 4f 4e 0a 20 20 20 26 26 20  R_EDITION.   && 
b680: 73 71 6c 69 74 65 33 53 65 72 76 65 72 49 73 52  sqlite3ServerIsR
b690: 65 61 64 6f 6e 6c 79 28 70 50 61 67 65 72 2d 3e  eadonly(pPager->
b6a0: 70 53 65 72 76 65 72 29 3d 3d 30 0a 23 65 6e 64  pServer)==0.#end
b6b0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
b6c0: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26  _HAS_CODEC.   &&
b6d0: 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d   pPager->xCodec=
b6e0: 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  =0.#endif.  ){. 
b6f0: 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20     pPager->xGet 
b700: 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a 23  = getPageMMap;.#
b710: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b720: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
b730: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
b740: 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67  pPager->xGet = g
b750: 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20 20  etPageNormal;.  
b760: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
b770: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
b780: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
b790: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
b7a0: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
b7b0: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
b7c0: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
b7d0: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b7e0: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
b7f0: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
b800: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
b810: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
b820: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
b830: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
b840: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
b850: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
b860: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
b870: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
b880: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
b890: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b8a0: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
b8b0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
b8c0: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
b8d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
b8e0: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
b8f0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
b900: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
b910: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65  ->pPager;.  Page
b920: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20  rSavepoint *p;. 
b930: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
b940: 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b  ->pgno;.  int i;
b950: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
b960: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
b970: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
b980: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
b990: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
b9a0: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
b9b0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
b9c0: 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 2d  ecTestNotNull(p-
b9d0: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
b9e0: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65  gno) ){.      re
b9f0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
ba00: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
ba10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
ba20: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
ba30: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
ba40: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
ba50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ba60: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
ba70: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
ba80: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
ba90: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
baa0: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
bab0: 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
bac0: 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
bad0: 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  gno);.}.#endif..
bae0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
baf0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
bb00: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
bb10: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
bb20: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
bb30: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
bb40: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
bb50: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
bb60: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
bb70: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
bb80: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
bb90: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
bba0: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
bbb0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
bbc0: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
bbd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
bbe0: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
bbf0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
bc00: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
bc10: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
bc20: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
bc30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
bc40: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
bc50: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
bc60: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
bc70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
bc80: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
bc90: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
bca0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bcb0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
bcc0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
bcd0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
bce0: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
bcf0: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
bd00: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
bd10: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
bd20: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a  yte((u8*)A,B)...
bd30: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
bd40: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
bd50: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
bd60: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
bd70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
bd80: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
bd90: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
bda0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
bdb0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
bdc0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
bdd0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
bde0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
bdf0: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
be00: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
be10: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
be20: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
be30: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
be40: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
be50: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
be60: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
be70: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
be80: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
be90: 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48  NO_LOCK.** or SH
bea0: 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72  ARED_LOCK. Regar
beb0: 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
bec0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c   or not the call
bed0: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
bee0: 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74   succeeds, set t
bef0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
bf00: 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68  ariable to match
bf10: 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29   the (attempted)
bf20: 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   new lock..**.**
bf30: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
bf40: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
bf50: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
bf60: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
bf70: 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20  n is.** called, 
bf80: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
bf90: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
bfa0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
bfb0: 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f  ine of .** UNKNO
bfc0: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
bfd0: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
bfe0: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
bff0: 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  t pagerUnlockDb(
c000: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
c010: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
c020: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c030: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
c040: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
c050: 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  de || pPager->eL
c060: 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock==eLock );.  
c070: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e  assert( eLock==N
c080: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  O_LOCK || eLock=
c090: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
c0a0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21    assert( eLock!
c0b0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65  =NO_LOCK || page
c0c0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
c0d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c0e0: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
c0f0: 7c 20 70 61 67 65 72 49 73 53 65 72 76 65 72 28  | pagerIsServer(
c100: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
c110: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
c120: 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
c130: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
c140: 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock>=eLock );.  
c150: 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e    rc = pPager->n
c160: 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f  oLock ? SQLITE_O
c170: 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  K : sqlite3OsUnl
c180: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
c190: 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  eLock);.    if( 
c1a0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55  pPager->eLock!=U
c1b0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20  NKNOWN_LOCK ){. 
c1c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
c1d0: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
c1e0: 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
c1f0: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64  E(("UNLOCK %p %d
c200: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f  \n", pPager, eLo
c210: 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck)).  }.  retur
c220: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
c230: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
c240: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
c250: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
c260: 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52 45   be either SHARE
c270: 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52  D_LOCK,.** RESER
c280: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
c290: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74  USIVE_LOCK. If t
c2a0: 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63  he caller is suc
c2b0: 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
c2c0: 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  .** Pager.eLock 
c2d0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
c2e0: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
c2f0: 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  e. .**.** Except
c300: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
c310: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
c320: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
c330: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  s function is .*
c340: 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74  * called, do not
c350: 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73   modify it unles
c360: 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  s the new lockin
c370: 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c 55  g state is EXCLU
c380: 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53  SIVE_LOCK. .** S
c390: 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
c3a0: 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
c3b0: 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   of UNKNOWN_LOCK
c3c0: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
c3d0: 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e  ion .** of this.
c3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
c3f0: 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72  agerLockDb(Pager
c400: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
c410: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
c420: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
c430: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48  ssert( eLock==SH
c440: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ARED_LOCK || eLo
c450: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
c460: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c  K || eLock==EXCL
c470: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
c480: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
c490: 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65  k<eLock || pPage
c4a0: 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
c4b0: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  N_LOCK ){.    rc
c4c0: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63   = pPager->noLoc
c4d0: 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  k ? SQLITE_OK : 
c4e0: 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
c4f0: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
c500: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
c510: 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67  LITE_OK && (pPag
c520: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
c530: 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d  WN_LOCK||eLock==
c540: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
c550: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
c560: 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f  >eLock = (u8)eLo
c570: 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ck;.      IOTRAC
c580: 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
c590: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
c5a0: 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
c5b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c5c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c5d0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
c5e0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
c5f0: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 72 0a 2a  tomic-write or.*
c600: 2a 20 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77  * atomic-batch-w
c610: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
c620: 6e 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ns can be used w
c630: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
c640: 54 68 65 0a 2a 2a 20 61 74 6f 6d 69 63 2d 77 72  The.** atomic-wr
c650: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
c660: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
c670: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
c680: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
c690: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
c6a0: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
c6b0: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
c6c0: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
c6d0: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
c6e0: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
c6f0: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
c700: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c710: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
c720: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
c730: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
c740: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
c750: 2a 0a 2a 2a 20 49 66 20 69 74 20 63 61 6e 20 62  *.** If it can b
c760: 65 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65  e used, then the
c770: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c780: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
c790: 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66  he journal .** f
c7a0: 69 6c 65 20 77 68 65 6e 20 69 74 20 63 6f 6e 74  ile when it cont
c7b0: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
c7c0: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
c7d0: 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ne page..**.** T
c7e0: 68 65 20 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d  he atomic-batch-
c7f0: 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
c800: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
c810: 66 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  f OsDeviceCharac
c820: 74 65 72 69 73 74 69 63 73 28 29 0a 2a 2a 20 72  teristics().** r
c830: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 77  eturns a value w
c840: 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 49  ith the SQLITE_I
c850: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
c860: 43 20 62 69 74 20 73 65 74 2e 20 2d 31 20 69 73  C bit set. -1 is
c870: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20  .** returned in 
c880: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
c890: 20 49 66 20 6e 65 69 74 68 65 72 20 6f 70 74 69   If neither opti
c8a0: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
c8b0: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
c8c0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
c8d0: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
c8e0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
c8f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
c900: 44 42 20 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  DB );..#if defin
c910: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
c920: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 20 5c  _ATOMIC_WRITE) \
c930: 0a 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  . || defined(SQL
c940: 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
c950: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20  _ATOMIC_WRITE). 
c960: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
c990: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
c9a0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
c9b0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
c9c0: 0a 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  dc = sqlite3O
c9d0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
c9e0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
c9f0: 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  d);.#endif..#ifd
ca00: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ca10: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
ca20: 49 54 45 0a 20 20 69 66 28 20 64 63 26 53 51 4c  ITE.  if( dc&SQL
ca30: 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f  ITE_IOCAP_BATCH_
ca40: 41 54 4f 4d 49 43 20 29 7b 0a 20 20 20 20 72 65  ATOMIC ){.    re
ca50: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e  turn -1;.  }.#en
ca60: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
ca70: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
ca80: 5f 57 52 49 54 45 0a 20 20 7b 0a 20 20 20 20 69  _WRITE.  {.    i
ca90: 6e 74 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61  nt nSector = pPa
caa0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
cab0: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20  .    int szPage 
cac0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
cad0: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
cae0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
caf0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
cb00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
cb10: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
cb20: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
cb30: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
cb40: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
cb50: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
cb60: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
cb70: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
cb80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
cb90: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
cba0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
cbb0: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
cbc0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 23 65  G_SZ(pPager);.#e
cbd0: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 30  ndif..  return 0
cbe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  ;.}../*.** If SQ
cbf0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
cc00: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
cc10: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
cc20: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
cc30: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
cc40: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
cc50: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
cc60: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
cc70: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
cc80: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
cc90: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
cca0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
ccb0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
ccc0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
ccd0: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
cce0: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
ccf0: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
cd00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
cd10: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
cd20: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
cd30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
cd40: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
cd50: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
cd60: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
cd70: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
cd80: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
cd90: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
cda0: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
cdb0: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
cdc0: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
cdd0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
cde0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
cdf0: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
ce00: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
ce10: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
ce20: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
ce30: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
ce40: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
ce50: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
ce60: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
ce70: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
ce80: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
ce90: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
cea0: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
ceb0: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
cec0: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
ced0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
cee0: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
cef0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
cf00: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
cf10: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
cf20: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
cf30: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
cf40: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
cf50: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
cf60: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
cf70: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
cf80: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
cf90: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
cfa0: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
cfb0: 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
cfc0: 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
cfd0: 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
cfe0: 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
cff0: 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73   || pPg->pageHas
d000: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
d010: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
d020: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
d030: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
d040: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
d050: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
d060: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74  define pager_set
d070: 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65  _pagehash(X).#de
d080: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
d090: 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51  x).#endif  /* SQ
d0a0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
d0b0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20   */../*.** When 
d0c0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
d0d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d0e0: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
d0f0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
d100: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d110: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64  attempts to read
d120: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d130: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d  l file name from
d140: 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20   the .** end of 
d150: 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66  the file and, if
d160: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70   successful, cop
d170: 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  ies it into memo
d180: 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ry supplied .** 
d190: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
d1a0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
d1b0: 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  e writeMasterJou
d1c0: 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66  rnal() for the f
d1d0: 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f  ormat.** used to
d1e0: 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20   store a master 
d1f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
d200: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
d210: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
d220: 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75  **.** zMaster mu
d230: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
d240: 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
d250: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61   nMaster bytes a
d260: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
d270: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20  he caller. This 
d280: 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65  should be sqlite
d290: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
d2a0: 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68  +1 (to ensure th
d2b0: 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68  ere is.** enough
d2c0: 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20   space to write 
d2d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d2e0: 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65  al name). If the
d2f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
d300: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a  ** name in the j
d310: 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72  ournal is longer
d320: 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79   than nMaster by
d330: 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61  tes (including a
d340: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
d350: 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69  or), then this i
d360: 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  s handled as if 
d370: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
d380: 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70  l name.** were p
d390: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f  resent in the jo
d3a0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
d3b0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
d3c0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
d3d0: 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  esent at the end
d3e0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
d3f0: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  ** file, then it
d400: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
d410: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
d420: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
d430: 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  . A.** nul-termi
d440: 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70  nator byte is ap
d450: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
d460: 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ffer following t
d470: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
d480: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  rnal file name..
d490: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64  **.** If it is d
d4a0: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
d4b0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
d4c0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
d4d0: 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65  esent .** zMaste
d4e0: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
d4f0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
d500: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
d510: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d520: 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  s while reading 
d530: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
d540: 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65   file, an SQLite
d550: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
d560: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
d570: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
d580: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
d590: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
d5a0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
d5b0: 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  u32 nMaster){.  
d5c0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
d5d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d5e0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
d5f0: 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
d600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
d610: 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20  gth in bytes of 
d620: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
d630: 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a  ame */.  i64 szJ
d640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d650: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
d660: 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f  e in bytes of jo
d670: 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c  urnal file pJrnl
d680: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20   /* MJ checksum 
d6b0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
d6c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
d6d0: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
d6e0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
d6f0: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
d700: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
d710: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
d720: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
d730: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
d740: 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74  eader */.  zMast
d750: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
d760: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
d770: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
d780: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
d790: 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c  szJ)).   || szJ<
d7a0: 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  16.   || SQLITE_
d7b0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
d7c0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
d7d0: 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c  16, &len)).   ||
d7e0: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20   len>=nMaster . 
d7f0: 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20    || len==0 .   
d800: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d810: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
d820: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
d830: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
d840: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
d850: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
d860: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
d870: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
d880: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
d890: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
d8a0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d8b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d8c0: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
d8d0: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
d8e0: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
d8f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
d900: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
d910: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
d920: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d930: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
d940: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
d950: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
d960: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
d970: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
d980: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
d990: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
d9a0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
d9b0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
d9c0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
d9d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
d9e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d9f0: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
da00: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
da10: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
da20: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
da30: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
da40: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
da50: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
da60: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
da70: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
da80: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
da90: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
daa0: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
dab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
dad0: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
dae0: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
daf0: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
db00: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
db10: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
db20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
db30: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
db40: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
db50: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
db60: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
db70: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
db80: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
db90: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
dba0: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
dbb0: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
dbc0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
dbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
dbf0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
dc00: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
dc10: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
dc20: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
dc30: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
dc50: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
dc80: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
dc90: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
dca0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
dcb0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
dcc0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
dcd0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
dce0: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
dcf0: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
dd00: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
dd10: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
dd20: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
dd30: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
dd40: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
dd50: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
dd60: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
dd70: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
dd80: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
dd90: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
dda0: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
ddb0: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
ddc0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
ddd0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
dde0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
ddf0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
de00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
de10: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
de20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
de30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
de40: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
de50: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
de60: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
de70: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
de80: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
de90: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
dea0: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
deb0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
dec0: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
ded0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
dee0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
def0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
df00: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
df10: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
df20: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
df30: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
df40: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
df50: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
df60: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
df70: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
df80: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
df90: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
dfa0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
dfb0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
dfc0: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
dfd0: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
dfe0: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
dff0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
e000: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
e010: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
e020: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
e030: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
e040: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
e050: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
e060: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
e070: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
e080: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
e090: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
e0a0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
e0b0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
e0c0: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
e0d0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
e0e0: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
e0f0: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
e100: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
e110: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
e120: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
e130: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
e140: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
e150: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
e160: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
e170: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
e180: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
e190: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
e1a0: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
e1b0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
e1c0: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
e1d0: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
e1e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e210: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
e220: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e230: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
e240: 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
e250: 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
e260: 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ory(pPager->jfd)
e270: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
e280: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
e290: 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c      const i64 iL
e2a0: 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  imit = pPager->j
e2b0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
e2c0: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
e2d0: 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20  he of jsl */..  
e2e0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52    IOTRACE(("JZER
e2f0: 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67  OHDR %p\n", pPag
e300: 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54  er)).    if( doT
e310: 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69  runcate || iLimi
e320: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
e330: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
e340: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
e350: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
e360: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
e370: 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72  nst char zeroHdr
e380: 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20  [28] = {0};.    
e390: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e3a0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
e3b0: 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65  d, zeroHdr, size
e3c0: 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b  of(zeroHdr), 0);
e3d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e3e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e3f0: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
e400: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
e410: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
e420: 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
e430: 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50  SYNC_DATAONLY|pP
e440: 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
e450: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e460: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
e470: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
e480: 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74   committed but t
e490: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20  he write lock . 
e4a0: 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68     ** is still h
e4b0: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  eld on the file.
e4c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
e4d0: 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67  ize limit config
e4e0: 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ured for .    **
e4f0: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
e500: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
e510: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72  journal file cur
e520: 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20  rently consumes 
e530: 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63  more.    ** spac
e540: 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69  e than that limi
e550: 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72  t allows for, tr
e560: 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  uncate it now. T
e570: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
e580: 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74      ** to sync t
e590: 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e  he file followin
e5a0: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
e5b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e5c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e5d0: 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20  & iLimit>0 ){.  
e5e0: 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20      i64 sz;.    
e5f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e600: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
e610: 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20  >jfd, &sz);.    
e620: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e630: 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74  _OK && sz>iLimit
e640: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e650: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
e660: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
e670: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  iLimit);.      }
e680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
e690: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e6a0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
e6b0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
e6c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
e6d0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
e6e0: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
e6f0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
e700: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
e710: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
e720: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
e730: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
e740: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
e750: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
e760: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
e770: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
e780: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
e790: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
e7a0: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
e7b0: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
e7c0: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
e7d0: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
e7e0: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
e7f0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
e800: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
e810: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
e820: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
e830: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
e840: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
e850: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
e860: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
e870: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
e880: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
e890: 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  l..** - 4 bytes:
e8a0: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73   Database page s
e8b0: 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  ize..** .** Foll
e8c0: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
e8d0: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
e8e0: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
e8f0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
e900: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
e910: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
e920: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e930: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
e940: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e950: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
e960: 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61  r *zHeader = pPa
e970: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
e980: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70   /* Temporary sp
e990: 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c  ace used to buil
e9a0: 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  d header */.  u3
e9b0: 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33 32  2 nHeader = (u32
e9c0: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
e9d0: 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66  e;/* Size of buf
e9e0: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
e9f0: 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75  y zHeader */.  u
ea00: 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  32 nWrite;      
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68     /* Bytes of h
ea30: 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72 69  eader sector wri
ea40: 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  tten */.  int ii
ea50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea70: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
ea80: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
ea90: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
eaa0: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
eab0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
eac0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20  open. */..  if( 
ead0: 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f  nHeader>JOURNAL_
eae0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
eaf0: 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20  {.    nHeader = 
eb00: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
eb10: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
eb20: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
eb30: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
eb40: 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d   and any of them
eb50: 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a 20   were created . 
eb60: 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f   ** since the mo
eb70: 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61  st recent journa
eb80: 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  l header was wri
eb90: 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65  tten, update the
eba0: 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65   .  ** PagerSave
ebb0: 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
ebc0: 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a   fields now..  *
ebd0: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
ebe0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
ebf0: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
ec00: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76  if( pPager->aSav
ec10: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
ec20: 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ffset==0 ){.    
ec30: 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
ec40: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
ec50: 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
ec60: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
ec70: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
ec80: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
ec90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
eca0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
ecb0: 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  t(pPager);..  /*
ecc0: 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65   .  ** Write the
ecd0: 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68   nRec Field - th
ece0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
ecf0: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
ed00: 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a  llow this.  ** j
ed10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e  ournal header. N
ed20: 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ormally, zero is
ed30: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
ed40: 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74   value at this t
ed50: 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20  ime..  ** After 
ed60: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
ed70: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  added to the jou
ed80: 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f  rnal (and the jo
ed90: 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20  urnal synced, . 
eda0: 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73   ** if in full-s
edb0: 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a  ync mode), the z
edc0: 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74  ero is overwritt
edd0: 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65  en with the true
ede0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
edf0: 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e  records (see syn
ee00: 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a  cJournal())..  *
ee10: 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20  *.  ** A faster 
ee20: 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74  alternative is t
ee30: 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46  o write 0xFFFFFF
ee40: 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66  FF to the nRec f
ee50: 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20  ield. When.  ** 
ee60: 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72  reading the jour
ee70: 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74  nal this value t
ee80: 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61  ells SQLite to a
ee90: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20  ssume that the. 
eea0: 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20   ** rest of the 
eeb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
eec0: 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65  tains valid page
eed0: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61   records. This a
eee0: 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  ssumption.  ** i
eef0: 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20  s dangerous, as 
ef00: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
ef10: 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  urred whilst wri
ef20: 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
ef30: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74  nal.  ** file it
ef40: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d   may contain som
ef50: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20  e garbage data. 
ef60: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63  There are two sc
ef70: 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65  enarios.  ** whe
ef80: 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e  re this risk can
ef90: 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a   be ignored:.  *
efa0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
efb0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
efc0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f  no-sync mode. Co
efd0: 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c  rruption can fol
efe0: 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70  low a.  **     p
eff0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20  ower failure in 
f000: 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79  this case anyway
f010: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
f020: 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  When the SQLITE_
f030: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
f040: 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  D flag is set. T
f050: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20  his guarantees. 
f060: 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72   **     that gar
f070: 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76  bage data is nev
f080: 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  er appended to t
f090: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
f0a0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
f0b0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
f0c0: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  d) || pPager->no
f0d0: 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70 50  Sync );.  if( pP
f0e0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
f0f0: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
f100: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
f110: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
f120: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
f130: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
f140: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
f150: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
f160: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
f170: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65  {.    memcpy(zHe
f180: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
f190: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
f1a0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
f1b0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f1c0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f1d0: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
f1e0: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
f1f0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65  {.    memset(zHe
f200: 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ader, 0, sizeof(
f210: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
f220: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
f230: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
f240: 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a  sh initializer *
f250: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
f260: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
f270: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
f280: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
f290: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
f2a0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
f2b0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f2c0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
f2d0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
f2e0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
f2f0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
f300: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
f310: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
f320: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
f330: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
f340: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
f350: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
f360: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
f370: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
f380: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f390: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
f3a0: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
f3b0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
f3c0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
f3d0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f3e0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f3f0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
f400: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
f410: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
f420: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
f430: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
f440: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
f450: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
f460: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
f470: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
f480: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
f490: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
f4a0: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
f4b0: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
f4c0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
f4d0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
f4e0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
f4f0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
f500: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
f510: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
f520: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f530: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
f540: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
f550: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f560: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
f570: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
f580: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
f590: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
f5a0: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
f5b0: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
f5c0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
f5d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
f5e0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
f5f0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
f600: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
f610: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
f620: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
f630: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
f640: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
f650: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
f660: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
f670: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
f680: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
f690: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
f6a0: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
f6b0: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
f6c0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
f6d0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
f6e0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
f6f0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
f700: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
f710: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
f720: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
f730: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
f740: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
f750: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
f760: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
f770: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
f780: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
f790: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
f7a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
f7b0: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
f7c0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
f7d0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
f7e0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
f7f0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
f800: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
f810: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
f820: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
f830: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
f840: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
f850: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
f860: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
f870: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
f880: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
f890: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
f8a0: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
f8b0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
f8c0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
f8d0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
f8e0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
f8f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
f900: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
f910: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
f920: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
f930: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
f940: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
f950: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
f960: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
f970: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
f980: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
f990: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
f9a0: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
f9b0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
f9c0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
f9d0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
f9e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
f9f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
fa00: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
fa10: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fa20: 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65  Off );.    pPage
fa30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
fa40: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
fa50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fa60: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
fa70: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
fa80: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
fa90: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
faa0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
fab0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
fac0: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
fad0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
fae0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
faf0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
fb00: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
fb10: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
fb20: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
fb30: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
fb40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
fb50: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
fb60: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
fb70: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
fb80: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
fb90: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fba0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
fbb0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
fbc0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
fbd0: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
fbe0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
fbf0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
fc00: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
fc10: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
fc20: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
fc30: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
fc40: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
fc50: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
fc60: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
fc70: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
fc80: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
fc90: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
fca0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
fcb0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
fcc0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
fcd0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
fce0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
fcf0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
fd00: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
fd10: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
fd20: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
fd30: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
fd40: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
fd50: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
fd60: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
fd70: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
fd80: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
fd90: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
fda0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
fdb0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
fdc0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
fdd0: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
fde0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
fdf0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
fe00: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
fe10: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
fe20: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
fe30: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
fe40: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
fe50: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
fe60: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
fe70: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe90: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
fea0: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
feb0: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
fec0: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
fed0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
fee0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
fef0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
ff00: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
ff10: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
ff20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ff30: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
ff40: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
ff50: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
ff60: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
ff70: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
ff80: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffa0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
ffb0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
ffc0: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
ffd0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
ffe0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
fff0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
10000 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
10010 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
10020 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
10030 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
10040 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
10050 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
10060 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
10070 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
10080 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
10090 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
100a0 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
100b0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
100c0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
100d0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
100e0 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
100f0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
10100 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
10110 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
10120 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
10130 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
10140 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
10150 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
10160 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10170 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
10180 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
10190 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
101a0 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
101b0 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
101c0 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
101d0 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
101e0 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
101f0 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
10200 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
10210 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
10220 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
10230 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
10240 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
10250 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
10260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
10270 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
10280 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10290 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
102a0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
102b0 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
102c0 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
102d0 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
102e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
102f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
10300 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
10310 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
10320 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
10330 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
10340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
10350 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
10360 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
10370 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
10380 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
10390 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
103a0 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
103b0 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
103c0 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
103d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
103e0 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
103f0 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
10400 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
10410 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
10420 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
10430 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
10440 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
10450 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
10460 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10470 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
10480 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
10490 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
104a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
104b0 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
104c0 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
104d0 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
104e0 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
104f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10500 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
10510 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10520 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
10530 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10540 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
10550 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
10560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
10570 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
10580 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
10590 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
105a0 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
105b0 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
105c0 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
105d0 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  nal header */.. 
105e0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70     /* Read the p
105f0 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
10600 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c  tor-size journal
10610 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20   header fields. 
10620 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  */.    if( SQLIT
10630 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
10640 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10650 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20  fd, iHdrOff+20, 
10660 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20  &iSectorSize)). 
10670 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
10680 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10690 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
106a0 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61  iHdrOff+24, &iPa
106b0 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a  geSize)).    ){.
106c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
106d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
106e0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
106f0 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38  e prior to 3.5.8
10700 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73 69   set the page-si
10710 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a  ze field of the.
10720 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68      ** journal h
10730 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49  eader to zero. I
10740 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73 73  n this case, ass
10750 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61 67  ume that the Pag
10760 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20 20  er.pageSize.    
10770 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  ** variable is a
10780 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74 68  lready set to th
10790 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20 73  e correct page s
107a0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
107b0 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d 30  if( iPageSize==0
107c0 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65 53   ){.      iPageS
107d0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
107e0 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20  geSize;.    }.. 
107f0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
10800 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64   the values read
10810 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73   from the page-s
10820 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
10830 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a  ize fields.    *
10840 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  * are within ran
10850 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61  ge. To be 'in ra
10860 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65  nge', both value
10870 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70  s need to be a p
10880 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ower.    ** of t
10890 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
108a0 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20  or equal to 512 
108b0 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67  or 32, and not g
108c0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
108d0 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63  r .    ** respec
108e0 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d  tive compile tim
108f0 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73  e maximum limits
10900 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10910 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20   iPageSize<512  
10920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10930 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33  || iSectorSize<3
10940 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
10950 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
10960 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
10970 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
10980 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
10990 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
109a0 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
109b0 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
109c0 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
109d0 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
109e0 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
109f0 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
10a00 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
10a10 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
10a20 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
10a30 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
10a40 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
10a50 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
10a60 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
10a70 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
10a80 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
10a90 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
10aa0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
10ab0 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
10ac0 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
10ad0 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
10ae0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
10af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
10b00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10b10 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
10b20 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
10b30 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
10b40 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
10b50 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
10b60 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
10b70 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
10b80 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
10b90 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
10ba0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
10bb0 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
10bc0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
10bd0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
10be0 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50 61  ize(pPager, &iPa
10bf0 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20  geSize, -1);.   
10c00 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
10c10 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
10c20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
10c30 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
10c40 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
10c50 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
10c60 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
10c70 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
10c80 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
10c90 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
10ca0 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
10cb0 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
10cc0 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
10cd0 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
10ce0 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
10cf0 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
10d00 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
10d10 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
10d20 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
10d30 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
10d40 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
10d50 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10d60 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
10d70 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
10d80 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
10d90 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
10da0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10db0 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
10dc0 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
10dd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
10de0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
10df0 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
10e00 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
10e10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10e20 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
10e30 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
10e40 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
10e50 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10e60 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
10e70 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
10e80 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
10e90 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
10ea0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
10eb0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
10ec0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
10ed0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
10ee0 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
10ef0 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
10f00 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
10f10 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
10f20 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
10f30 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
10f40 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
10f50 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
10f60 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
10f70 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
10f80 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
10f90 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
10fa0 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
10fb0 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
10fc0 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
10fd0 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
10fe0 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10ff0 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
11000 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
11010 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
11020 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
11030 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
11040 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
11050 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
11060 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
11070 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
11080 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
11090 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
110a0 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
110b0 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
110c0 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
110d0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
110e0 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
110f0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
11100 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
11110 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
11120 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
11130 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
11140 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
11150 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
11160 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
11170 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
111a0 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
111d0 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
111e0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
111f0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
11200 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
11210 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
11220 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
11230 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
11260 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
11270 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
11280 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
11290 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
112a0 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
112b0 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ster */..  asser
112c0 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  t( pPager->setMa
112d0 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ster==0 );.  ass
112e0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
112f0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
11300 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20 20  if( !zMaster .  
11310 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
11320 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
11330 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
11340 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65 6e  Y .   || !isOpen
11350 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20 20  (pPager->jfd).  
11360 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
11380 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
11390 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
113a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
113b0 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
113c0 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f  urnalOff );..  /
113d0 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20  * Calculate the 
113e0 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20  length in bytes 
113f0 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
11400 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20   of zMaster */. 
11410 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20   for(nMaster=0; 
11420 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
11430 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20  ; nMaster++){.  
11440 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74    cksum += zMast
11450 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d  er[nMaster];.  }
11460 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
11470 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
11480 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
11490 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
114a0 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
114b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
114c0 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
114d0 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
114e0 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
114f0 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
11500 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
11510 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
11520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
11530 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
11540 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
11550 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
11560 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
11570 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  );.  }.  iHdrOff
11580 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
11590 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69  alOff;..  /* Wri
115a0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
115b0 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68  urnal data to th
115c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
115d0 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20  rnal file. If.  
115e0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
115f0 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  rs, return the e
11600 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
11610 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20   caller..  */.  
11620 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20  if( (0 != (rc = 
11630 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11640 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11650 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  , PAGER_MJ_PGNO(
11660 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c  pPager)))).   ||
11670 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
11680 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
11690 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
116a0 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f  , nMaster, iHdrO
116b0 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30  ff+4))).   || (0
116c0 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
116d0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
116e0 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
116f0 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29  ster, nMaster)))
11700 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11710 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
11720 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
11730 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c  Off+4+nMaster+4,
11740 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20   cksum))).   || 
11750 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
11760 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
11770 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
11780 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20 20 20  Magic, 8,.      
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 20 20 20 20 20 20 20 20 20 20 20 69 48 64 72 4f             iHdrO
117b0 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
117c0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
117d0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
117e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
117f0 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
11800 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
11810 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
11820 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
11830 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
11840 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
11850 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
11860 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
11870 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11880 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
11890 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
118a0 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
118b0 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
118c0 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
118d0 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
118e0 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
118f0 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
11900 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
11910 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
11920 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
11930 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
11940 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
11950 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
11960 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
11970 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
11980 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
11990 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
119a0 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
119b0 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
119c0 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
119d0 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
119e0 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
119f0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
11a00 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
11a10 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
11a20 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
11a30 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
11a40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
11a50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11a60 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11a70 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11a80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
11a90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11aa0 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
11ab0 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
11ac0 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
11ad0 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65 2e  mory page-cache.
11ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11af0 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
11b00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50  r *pPager){.  pP
11b10 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
11b20 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 42  on++;.  sqlite3B
11b30 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
11b40 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
11b50 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
11b60 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
11b70 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  che);.}../*.** R
11b80 65 74 75 72 6e 20 74 68 65 20 70 50 61 67 65 72  eturn the pPager
11b90 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 20 76  ->iDataVersion v
11ba0 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  alue.*/.u32 sqli
11bb0 74 65 33 50 61 67 65 72 44 61 74 61 56 65 72 73  te3PagerDataVers
11bc0 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
11bd0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  r){.  assert( pP
11be0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
11bf0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72 65 74  ER_OPEN );.  ret
11c00 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61 74  urn pPager->iDat
11c10 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a  aVersion;.}../*.
11c20 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75  ** Free all stru
11c30 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61  ctures in the Pa
11c40 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d  ger.aSavepoint[]
11c50 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62   array and set b
11c60 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61  oth.** Pager.aSa
11c70 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65  vepoint and Page
11c80 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20  r.nSavepoint to 
11c90 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20  zero. Close the 
11ca0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  sub-journal.** i
11cb0 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64  f it is open and
11cc0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
11cd0 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
11ce0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
11cf0 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  oid releaseAllSa
11d00 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a  vepoints(Pager *
11d10 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69  pPager){.  int i
11d20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11d30 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
11d40 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
11d50 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
11d60 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b  t */.  for(ii=0;
11d70 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
11d80 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
11d90 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
11da0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
11db0 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
11dc0 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
11dd0 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
11de0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
11df0 7c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  | sqlite3Journal
11e00 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65  IsInMemory(pPage
11e10 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
11e20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11e30 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
11e40 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
11e50 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
11e60 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
11e70 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
11e80 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
11e90 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
11ea0 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
11eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
11ec0 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
11ed0 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
11ee0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
11ef0 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
11f00 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
11f10 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
11f20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
11f30 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
11f40 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
11f50 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
11f60 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
11f70 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
11f80 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
11f90 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
11fa0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
11fd0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
11fe0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
11ff0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12000 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
12010 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
12020 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
12030 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
12040 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
12050 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
12060 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
12070 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
12080 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
12090 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
120a0 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
120b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
120c0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
120d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
120e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
120f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
12100 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
12110 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
12120 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52  ifdef SQLITE_SER
12130 56 45 52 5f 45 44 49 54 49 4f 4e 0a 2f 2a 0a 2a  VER_EDITION./*.*
12140 2a 20 46 72 65 65 20 74 68 65 20 6c 69 6e 6b 65  * Free the linke
12150 64 20 6c 69 73 74 20 6f 66 20 53 65 72 76 65 72  d list of Server
12160 50 61 67 65 20 6f 62 6a 65 63 74 73 20 68 65 61  Page objects hea
12170 64 65 64 20 61 74 20 50 61 67 65 72 2e 70 53 65  ded at Pager.pSe
12180 72 76 65 72 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  rverPage..*/.sta
12190 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
121a0 65 65 53 65 72 76 65 72 50 61 67 65 28 50 61 67  eeServerPage(Pag
121b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 53  er *pPager){.  S
121c0 65 72 76 65 72 50 61 67 65 20 2a 70 50 67 3b 0a  erverPage *pPg;.
121d0 20 20 53 65 72 76 65 72 50 61 67 65 20 2a 70 4e    ServerPage *pN
121e0 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  ext;.  for(pPg=p
121f0 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 50 61  Pager->pServerPa
12200 67 65 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ge; pPg; pPg=pNe
12210 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
12220 20 70 50 67 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pPg->pNext;.   
12230 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
12240 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
12250 2d 3e 70 53 65 72 76 65 72 50 61 67 65 20 3d 20  ->pServerPage = 
12260 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
12270 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12280 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
12290 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
122a0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
122b0 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
122c0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
122d0 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
122e0 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
122f0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
12300 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
12310 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
12320 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
12330 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
12340 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
12350 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
12360 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
12370 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
12380 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
12390 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
123a0 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
123b0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
123c0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
123d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
123e0 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
123f0 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
12400 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
12410 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
12420 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
12430 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
12440 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
12450 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12460 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
12470 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
12480 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
12490 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
124a0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
124b0 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
124c0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
124d0 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
124e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
124f0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
12500 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
12510 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
12520 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
12530 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
12540 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
12550 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
12560 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
12570 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
12580 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
12590 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
125a0 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
125b0 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
125c0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
125d0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
125e0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
125f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12600 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
12610 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
12620 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
12630 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69   );..  sqlite3Bi
12640 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
12650 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
12660 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
12670 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c  urnal = 0;.  rel
12680 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
12690 73 28 70 50 61 67 65 72 29 3b 0a 0a 23 69 66 64  s(pPager);..#ifd
126a0 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52  ef SQLITE_SERVER
126b0 5f 45 44 49 54 49 4f 4e 0a 20 20 69 66 28 20 70  _EDITION.  if( p
126c0 61 67 65 72 49 73 53 65 72 76 65 72 28 70 50 61  agerIsServer(pPa
126d0 67 65 72 29 20 29 7b 0a 20 20 20 20 70 61 67 65  ger) ){.    page
126e0 72 46 72 65 65 53 65 72 76 65 72 50 61 67 65 28  rFreeServerPage(
126f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  pPager);.    sql
12700 69 74 65 33 53 65 72 76 65 72 45 6e 64 28 70 50  ite3ServerEnd(pP
12710 61 67 65 72 2d 3e 70 53 65 72 76 65 72 29 3b 0a  ager->pServer);.
12720 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12730 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12740 0a 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66  .  }else .#endif
12750 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
12760 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
12770 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
12780 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
12790 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
127a0 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
127b0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
127c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
127d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
127e0 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  N;.  }else if( !
127f0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
12800 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
12810 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
12820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
12830 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
12840 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b  d by pagerUnlock
12850 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Db() */.    int 
12860 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61  iDc = isOpen(pPa
12870 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33  ger->fd)?sqlite3
12880 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
12890 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
128a0 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  fd):0;..    /* I
128b0 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
128c0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64  system support d
128d0 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20  eletion of open 
128e0 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20  files, then.    
128f0 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ** close the jou
12900 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
12910 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
12920 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65  base lock.  Othe
12930 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f  rwise.    ** ano
12940 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
12950 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
12960 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64  e=delete might d
12970 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20  elete the file. 
12980 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75     ** out from u
12990 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
129a0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
129b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
129c0 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20  EMORY   & 5)!=1 
129d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
129e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
129f0 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21  E_OFF      & 5)!
12a00 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12a10 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12a20 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20  MODE_WAL      & 
12a30 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12a40 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12a50 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
12a60 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12a70 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12a80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
12a90 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ATE & 5)==1 );. 
12aa0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12ab0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
12ac0 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29  RSIST  & 5)==1 )
12ad0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44  ;.    if( 0==(iD
12ae0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
12af0 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
12b00 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20  N_OPEN).     || 
12b10 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  1!=(pPager->jour
12b20 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20  nalMode & 5).   
12b30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12b40 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
12b50 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
12b60 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
12b70 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f  r is in the ERRO
12b80 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12b90 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  call to unlock t
12ba0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
12bb0 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73  ** file fails, s
12bc0 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  et the current l
12bd0 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  ock to UNKNOWN_L
12be0 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  OCK. See the com
12bf0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76  ment.    ** abov
12c00 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
12c10 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  r UNKNOWN_LOCK f
12c20 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
12c30 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  n of why this.  
12c40 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72    ** is necessar
12c50 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  y..    */.    rc
12c60 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
12c70 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b  (pPager, NO_LOCK
12c80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12c90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
12ca0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12cb0 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  R_ERROR ){.     
12cc0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
12cd0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20   UNKNOWN_LOCK;. 
12ce0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
12cf0 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79   pager state may
12d00 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d   be changed from
12d10 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20   PAGER_ERROR to 
12d20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a  PAGER_OPEN here.
12d30 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63      ** without c
12d40 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f  learing the erro
12d50 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  r code. This is 
12d60 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68  intentional - th
12d70 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63  e error.    ** c
12d80 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61  ode is cleared a
12d90 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73  nd the cache res
12da0 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  et in the block 
12db0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
12dc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12dd0 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
12de0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
12df0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20  ER_ERROR );.    
12e00 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12e10 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
12e20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12e30 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
12e40 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72  }..  /* If Pager
12e50 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
12e60 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12e70 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12e80 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20   cannot be.  ** 
12e90 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
12ea0 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  t there are no o
12eb0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
12ec0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
12ed0 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20  er,.  ** it can 
12ee0 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b  safely move back
12ef0 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   to PAGER_OPEN s
12f00 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65  tate. This happe
12f10 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20  ns in both.  ** 
12f20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75  normal and exclu
12f30 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
12f40 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
12f50 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
12f60 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  e==SQLITE_OK || 
12f70 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
12f80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12f90 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
12fa0 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
12fb0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
12fc0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
12fd0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12fe0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12ff0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
13000 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
13010 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  N;.    }else{.  
13020 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
13030 74 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50 61  te = (isOpen(pPa
13040 67 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45  ger->jfd) ? PAGE
13050 52 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f 52  R_OPEN : PAGER_R
13060 45 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20  EADER);.    }.  
13070 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
13080 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33  Pager) ) sqlite3
13090 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
130a0 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->fd, 0, 0);.   
130b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
130c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
130d0 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
130e0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  d(pPager);.  }..
130f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13100 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
13110 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
13120 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
13130 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
13140 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
13150 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
13160 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
13170 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
13180 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
13190 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
131a0 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
131b0 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
131c0 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
131d0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
131e0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
131f0 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
13200 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
13210 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
13220 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
13230 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
13240 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
13250 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
13260 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
13270 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
13280 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
13290 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
132a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
132b0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
132c0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
132d0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
132e0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
132f0 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
13300 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
13310 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
13320 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
13330 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
13340 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
13350 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
13360 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
13370 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
13380 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
13390 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
133a0 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
133b0 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
133c0 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
133d0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
133e0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
133f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
13400 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
13410 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
13420 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
13430 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
13440 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
13450 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
13460 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
13470 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
13480 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
13490 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
134a0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
134b0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
134c0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
134d0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
134e0 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
134f0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
13500 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
13510 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13520 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
13530 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
13540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13550 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
13560 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
13570 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
13580 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
13590 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
135a0 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
135b0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
135c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
135d0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
135e0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
135f0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
13600 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
13610 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
13620 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
13630 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
13640 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
13650 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
13660 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
13670 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
13680 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
13690 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
136a0 4f 52 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65  OR;.    setGette
136b0 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b  rMethod(pPager);
136c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
136d0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
136e0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
136f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
13700 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a  no nPage);../*.*
13710 2a 20 54 68 65 20 77 72 69 74 65 20 74 72 61 6e  * The write tran
13720 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20  saction open on 
13730 70 50 61 67 65 72 20 69 73 20 62 65 69 6e 67 20  pPager is being 
13740 63 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d  committed (bComm
13750 69 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c  it==1).** or rol
13760 6c 65 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69  led back (bCommi
13770 74 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  t==0)..**.** Ret
13780 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20  urn TRUE if and 
13790 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69 72 74  only if all dirt
137a0 79 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62  y pages should b
137b0 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
137c0 6b 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a  k..**.** Rules:.
137d0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e  **.**   *  For n
137e0 6f 6e 2d 54 45 4d 50 20 64 61 74 61 62 61 73 65  on-TEMP database
137f0 73 2c 20 61 6c 77 61 79 73 20 73 79 6e 63 20 74  s, always sync t
13800 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 69 73  o disk.  This is
13810 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 20 20   necessary.**   
13820 20 20 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69     for transacti
13830 6f 6e 73 20 74 6f 20 62 65 20 64 75 72 61 62 6c  ons to be durabl
13840 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79  e..**.**   *  Sy
13850 6e 63 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  nc TEMP database
13860 20 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49   only on a COMMI
13870 54 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43  T (not a ROLLBAC
13880 4b 29 20 77 68 65 6e 20 74 68 65 20 62 61 63 6b  K) when the back
13890 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  ing.**      file
138a0 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
138b0 64 20 61 6c 72 65 61 64 79 20 28 76 69 61 20 61  d already (via a
138c0 20 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53   spill on pagerS
138d0 74 72 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20  tress()) and.** 
138e0 20 20 20 20 20 77 68 65 6e 20 74 68 65 20 6e 75       when the nu
138f0 6d 62 65 72 20 6f 66 20 64 69 72 74 79 20 70 61  mber of dirty pa
13900 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78  ges in memory ex
13910 63 65 65 64 73 20 32 35 25 20 6f 66 20 74 68 65  ceeds 25% of the
13920 20 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63   total.**      c
13930 61 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  ache size..*/.st
13940 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 46 6c  atic int pagerFl
13950 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65  ushOnCommit(Page
13960 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 62  r *pPager, int b
13970 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20 70  Commit){.  if( p
13980 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
13990 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
139a0 20 69 66 28 20 21 62 43 6f 6d 6d 69 74 20 29 20   if( !bCommit ) 
139b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
139c0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
139d0 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  fd) ) return 0;.
139e0 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65    return (sqlite
139f0 33 50 43 61 63 68 65 50 65 72 63 65 6e 74 44 69  3PCachePercentDi
13a00 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
13a10 63 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a  che)>=25);.}../*
13a20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13a30 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
13a40 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
13a50 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
13a60 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
13a70 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
13a80 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
13a90 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
13aa0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
13ab0 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
13ac0 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
13ad0 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
13ae0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
13af0 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
13b00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
13b10 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
13b20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
13b30 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
13b40 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
13b50 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  n..** .** This r
13b60 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
13b70 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f  called in PAGER_
13b80 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20  ERROR state. If 
13b90 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  it is called.** 
13ba0 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72  in PAGER_NONE or
13bb0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
13bc0 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ate and the lock
13bd0 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a   held is less.**
13be0 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20   exclusive than 
13bf0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  a RESERVED lock,
13c00 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
13c10 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
13c20 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
13c30 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
13c40 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
13c50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13c60 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
13c70 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
13c80 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
13c90 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
13ca0 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
13cb0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
13cc0 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
13cd0 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
13ce0 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
13cf0 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
13d00 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
13d10 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
13d20 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
13d30 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13d40 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
13d50 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13d60 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
13d70 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
13d80 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
13d90 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
13da0 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
13db0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
13dc0 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
13dd0 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
13de0 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
13df0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13e00 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
13e10 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
13e20 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
13e30 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
13e40 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
13e50 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
13e60 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
13e70 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
13e80 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
13e90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
13ea0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
13eb0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
13ec0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13ed0 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
13ee0 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
13ef0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
13f00 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
13f10 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
13f20 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
13f30 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
13f40 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
13f50 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
13f60 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
13f70 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
13f80 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
13f90 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
13fa0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
13fb0 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
13fc0 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
13fd0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
13fe0 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
13ff0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
14000 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
14010 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
14020 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
14030 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
14040 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
14050 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
14060 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
14070 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
14080 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
14090 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
140a0 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
140b0 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
140c0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
140d0 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
140e0 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
140f0 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
14100 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
14110 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
14120 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
14130 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
14140 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  ized, the pager 
14150 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52  moves to PAGER_R
14160 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20  EADER state..** 
14170 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  If running in no
14180 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c  n-exclusive roll
14190 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c  back mode, the l
141a0 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
141b0 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65  is .** downgrade
141c0 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f  d to a SHARED_LO
141d0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
141e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
141f0 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
14200 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
14210 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a  occurs during.**
14220 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f   any of the IO o
14230 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e  perations to fin
14240 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
14250 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b  l file or unlock
14260 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
14270 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
14280 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14290 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
142a0 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72   If the .** oper
142b0 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a  ation to finaliz
142c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
142d0 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  le fails, then t
142e0 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a  he code still.**
142f0 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b   tries to unlock
14300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14310 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63  le if not in exc
14320 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20  lusive mode. If 
14330 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70  the.** unlock op
14340 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73  eration fails as
14350 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   well, then the 
14360 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65  first error code
14370 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74   related.** to t
14380 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65  he first error e
14390 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20  ncountered (the 
143a0 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
143b0 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20  tion one) is.** 
143c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
143d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
143e0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
143f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
14400 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20   hasMaster, int 
14410 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20  bCommit){.  int 
14420 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
14430 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
14440 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
14450 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
14460 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
14470 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
14480 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
14490 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
144a0 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
144b0 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
144c0 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
144d0 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
144e0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
144f0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
14500 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
14510 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
14520 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
14530 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
14540 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
14550 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
14560 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
14570 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
14580 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
14590 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
145a0 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
145b0 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
145c0 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
145d0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
145e0 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
145f0 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
14600 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
14610 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
14620 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
14630 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
14640 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
14650 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
14660 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
14670 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
14680 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
14690 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
146a0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
146b0 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
146c0 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
146d0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
146e0 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
146f0 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
14700 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
14710 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
14720 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
14730 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
14740 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
14750 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
14760 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
14770 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14780 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
14790 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
147a0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
147b0 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
147c0 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
147d0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
147e0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
147f0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
14800 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14810 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
14820 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
14830 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
14840 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
14850 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
14860 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
14870 30 20 0a 20 20 20 20 20 20 7c 7c 20 28 73 71 6c  0 .      || (sql
14880 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
14890 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
148a0 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
148b0 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
148c0 43 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 73  C).  );.  if( is
148d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
148e0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
148f0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
14900 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
14910 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   Finalize the jo
14920 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
14930 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f     if( sqlite3Jo
14940 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28  urnalIsInMemory(
14950 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
14960 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
14970 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14980 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14990 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
149a0 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
149b0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
149c0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
149d0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
149e0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
149f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
14a00 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  NCATE ){.      i
14a10 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14a20 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
14a30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14a40 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
14a50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14a60 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
14a70 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
14a80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
14a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
14aa0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
14ab0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  {.          /* M
14ac0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
14ad0 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72   file size is wr
14ae0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
14af0 6e 6f 64 65 20 72 69 67 68 74 20 61 77 61 79 2e  node right away.
14b00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  .          ** Ot
14b10 68 65 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72  herwise the jour
14b20 6e 61 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72  nal might resurr
14b30 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20  ect following a 
14b40 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20  power loss and. 
14b50 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73           ** caus
14b60 65 20 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73  e the last trans
14b70 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62  action to roll b
14b80 61 63 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20  ack.  See.      
14b90 20 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62      ** https://b
14ba0 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e  ugzilla.mozilla.
14bb0 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69  org/show_bug.cgi
14bc0 3f 69 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20  ?id=1072773.    
14bd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
14be0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14bf0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
14c00 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
14c10 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d  lags);.        }
14c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14c30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14c40 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
14c50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
14c60 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14c70 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
14c80 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  IST.      || (pP
14c90 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14ca0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ode && pPager->j
14cb0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
14cc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
14cd0 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  L).    ){.      
14ce0 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
14cf0 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
14d00 61 73 74 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74  aster||pPager->t
14d10 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
14d20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14d30 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
14d40 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
14d50 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
14d60 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
14d70 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
14d80 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
14d90 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
14da0 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
14db0 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
14dc0 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
14dd0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
14de0 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
14df0 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
14e00 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
14e10 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
14e20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
14e30 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
14e40 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
14e50 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20  emory journal.. 
14e60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
14e70 74 20 62 44 65 6c 65 74 65 20 3d 20 21 70 50 61  t bDelete = !pPa
14e80 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
14e90 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
14ea0 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
14eb0 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  emory(pPager->jf
14ec0 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  d)==0 );.      a
14ed0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
14ee0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
14ef0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
14f00 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20  LETE .          
14f10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
14f20 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
14f30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
14f40 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y .           ||
14f50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14f60 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14f70 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
14f80 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
14f90 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
14fa0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
14fb0 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20  f( bDelete ){.  
14fc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14fd0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
14fe0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
14ff0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
15000 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a 20  r->extraSync);. 
15010 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15020 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
15030 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71  CHECK_PAGES.  sq
15040 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
15050 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
15060 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73  pPCache, pager_s
15070 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20  et_pagehash);.  
15080 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
15090 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  ze==0 && sqlite3
150a0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
150b0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
150c0 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  0 ){.    PgHdr *
150d0 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
150e0 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31  Lookup(pPager, 1
150f0 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
15100 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73        p->pageHas
15110 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  h = 0;.      sql
15120 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
15130 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a  tNull(p);.    }.
15140 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
15150 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
15160 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
15170 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
15180 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
15190 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
151a0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d   = 0;.  if( rc==
151b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
151c0 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61   if( MEMDB || pa
151d0 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74  gerFlushOnCommit
151e0 28 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74  (pPager, bCommit
151f0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
15200 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
15210 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15220 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15230 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
15240 65 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70  eClearWritable(p
15250 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
15260 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15270 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
15280 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15290 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
152a0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  );.  }..  if( pa
152b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
152c0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70  ) ){.    /* Drop
152d0 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c   the WAL write-l
152e0 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73  ock, if any. Als
152f0 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  o, if the connec
15300 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20  tion was in .   
15310 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   ** locking_mode
15320 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
15330 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
15340 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  , drop the EXCLU
15350 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  SIVE .    ** loc
15360 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  k held on the da
15370 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
15380 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71   */.    rc2 = sq
15390 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65  lite3WalEndWrite
153a0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
153b0 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61  er->pWal);.    a
153c0 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49  ssert( rc2==SQLI
153d0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65  TE_OK );.  }else
153e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
153f0 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26  OK && bCommit &&
15400 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
15410 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  ize>pPager->dbSi
15420 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ze ){.    /* Thi
15430 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
15440 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  n when committin
15450 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
15460 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  in rollback-jour
15470 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20  nal.    ** mode 
15480 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
15490 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
154a0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
154b0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
154c0 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
154d0 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  oint the journal
154e0 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
154f0 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e  zed and the tran
15500 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  saction .    ** 
15510 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
15520 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20  mitted, but the 
15530 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
15540 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
15550 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  the.    ** file.
15560 20 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   So it is safe t
15570 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  o truncate the d
15580 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
15590 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  its minimum.    
155a0 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  ** required size
155b0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
155c0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
155d0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
155e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
155f0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
15600 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
15610 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  e);.  }..  if( r
15620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15630 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65  bCommit && isOpe
15640 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
15650 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15660 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
15670 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
15680 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50  E_FCNTL_COMMIT_P
15690 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20  HASETWO, 0);.   
156a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
156b0 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
156c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
156d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
156e0 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 69  RVER_EDITION.  i
156f0 66 28 20 70 61 67 65 72 49 73 53 65 72 76 65 72  f( pagerIsServer
15700 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
15710 72 63 32 20 3d 20 73 71 6c 69 74 65 33 53 65 72  rc2 = sqlite3Ser
15720 76 65 72 45 6e 64 57 72 69 74 65 28 70 50 61 67  verEndWrite(pPag
15730 65 72 2d 3e 70 53 65 72 76 65 72 29 3b 0a 20 20  er->pServer);.  
15740 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69  }else.#endif.  i
15750 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
15760 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26  usiveMode .   &&
15770 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70   (!pagerUseWal(p
15780 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65  Pager) || sqlite
15790 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
157a0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
157b0 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32  0)).  ){.    rc2
157c0 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
157d0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
157e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
157f0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
15800 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ne = 0;.  }.  pP
15810 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
15820 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70  AGER_READER;.  p
15830 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
15840 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
15850 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
15860 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
15870 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
15880 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
15890 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
158a0 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
158b0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
158c0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
158d0 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
158e0 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
158f0 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  OR state, do not
15900 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65   attempt .** the
15910 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69   rollback at thi
15920 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c  s time. Instead,
15930 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
15940 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a  is called. The.*
15950 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
15960 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69  unlock() will di
15970 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
15980 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63  ory pages, unloc
15990 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  k.** the databas
159a0 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20  e file and move 
159b0 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
159c0 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66  o OPEN state. If
159d0 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20   this .** means 
159e0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
159f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  hot-journal left
15a00 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
15a10 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a  tem, the next .*
15a20 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * connection to 
15a30 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
15a40 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
15a50 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  r (which may be 
15a60 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69  this one) .** wi
15a70 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ll roll it back.
15a80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
15a90 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
15aa0 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
15ab0 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74  ERROR state, but
15ac0 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
15ad0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
15ae0 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
15af0 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
15b00 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
15b10 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
15b20 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
15b30 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
15b40 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
15b50 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
15b60 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
15b70 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
15b80 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
15b90 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
15ba0 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
15bb0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
15bc0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
15bd0 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
15be0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
15bf0 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
15c00 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
15c10 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
15c20 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  er) );.    if( p
15c30 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
15c40 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
15c50 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ED ){.      sqli
15c60 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
15c70 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71  lloc();.      sq
15c80 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
15c90 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
15ca0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
15cb0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
15cc0 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
15cd0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
15ce0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
15cf0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15d00 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
15d10 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e  ;.      pager_en
15d20 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
15d30 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ager, 0, 0);.   
15d40 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75   }.  }.  pager_u
15d50 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
15d60 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
15d70 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69  r aData must poi
15d80 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
15d90 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  f pPager->pageSi
15da0 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  ze bytes.** of d
15db0 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64  ata. Compute and
15dc0 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
15dd0 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65  um based ont the
15de0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
15df0 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74   .** page of dat
15e00 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  a and the curren
15e10 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65  t value of pPage
15e20 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a  r->cksumInit..**
15e30 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
15e40 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
15e50 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
15e60 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
15e70 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
15e80 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67  tial value (pPag
15e90 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61  er->cksumInit) a
15ea0 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62  nd every 200th b
15eb0 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  yte.** of the pa
15ec0 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e  ge data, startin
15ed0 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73  g with byte offs
15ee0 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  et (pPager->page
15ef0 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61  Size%200)..** Ea
15f00 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
15f10 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62  preted as an 8-b
15f20 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  it unsigned inte
15f30 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  ger..**.** Chang
15f40 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20  ing the formula 
15f50 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
15f60 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65  this checksum re
15f70 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69  sults in an.** i
15f80 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72  ncompatible jour
15f90 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  nal file format.
15fa0 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61  .**.** If journa
15fb0 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  l corruption occ
15fc0 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
15fd0 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
15fe0 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20  most likely .** 
15ff0 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74  scenario is that
16000 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
16010 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
16020 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
16030 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d  ged. .** It is m
16040 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
16050 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
16060 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
16070 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
16080 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
16090 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
160a0 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
160b0 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
160c0 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
160d0 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
160e0 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
160f0 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
16100 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  f corruption..*/
16110 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
16120 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
16130 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
16140 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
16150 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
16160 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
16170 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61    /* Checksum va
16180 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
16190 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
161a0 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
161b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
161c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77  p counter */.  w
161d0 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20  hile( i>0 ){.   
161e0 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b   cksum += aData[
161f0 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30  i];.    i -= 200
16200 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
16210 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ksum;.}../*.** R
16220 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e  eport the curren
16230 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
16240 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
16250 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a  ed bytes back.**
16260 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a   to the codec..*
16270 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
16280 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63  HAS_CODEC.static
16290 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72   void pagerRepor
162a0 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  tSize(Pager *pPa
162b0 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
162c0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
162d0 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ng ){.    pPager
162e0 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
162f0 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c  (pPager->pCodec,
16300 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16310 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
16330 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  nt)pPager->nRese
16340 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  rve);.  }.}.#els
16350 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
16360 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20  ReportSize(X)   
16370 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65    /* No-op if we
16380 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
16390 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69  a codec */.#endi
163a0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
163b0 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a  _HAS_CODEC./*.**
163c0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
163d0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
163e0 64 20 62 69 74 73 20 69 73 20 74 68 65 20 73 61  d bits is the sa
163f0 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74 69 6e  me in the destin
16400 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72 20 61  ation.** pager a
16410 73 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 73  s it is in the s
16420 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63 6f 6d  ource.  This com
16430 65 73 20 75 70 20 77 68 65 6e 20 61 20 56 41 43  es up when a VAC
16440 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68 65 0a  UUM changes the.
16450 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  ** number of res
16460 65 72 76 65 64 20 62 69 74 73 20 74 6f 20 74 68  erved bits to th
16470 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d 6f 75  e "optimal" amou
16480 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
16490 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52 65 73  te3PagerAlignRes
164a0 65 72 76 65 28 50 61 67 65 72 20 2a 70 44 65 73  erve(Pager *pDes
164b0 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63 29 7b  t, Pager *pSrc){
164c0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e 52  .  if( pDest->nR
164d0 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e 6e 52  eserve!=pSrc->nR
164e0 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20 70 44  eserve ){.    pD
164f0 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  est->nReserve = 
16500 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  pSrc->nReserve;.
16510 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
16520 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a  ize(pDest);.  }.
16530 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16540 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
16550 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
16560 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16570 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
16580 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
16590 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
165a0 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
165b0 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
165c0 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
165d0 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
165e0 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
165f0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
16600 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
16610 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
16620 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
16630 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
16640 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
16650 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f  *.** The main ro
16660 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
16670 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  ses checksums - 
16680 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
16690 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e  urnal does .** n
166a0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
166b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
166c0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
166d0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
166e0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
166f0 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
16700 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
16710 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
16720 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
16730 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
16740 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
16750 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
16760 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
16770 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
16780 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
16790 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
167a0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
167b0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
167c0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
167d0 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
167e0 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
167f0 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
16800 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
16810 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
16820 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
16830 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
16840 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
16850 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
16860 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
16870 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
16880 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
16890 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
168a0 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
168b0 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
168c0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
168d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
168e0 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
168f0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
16900 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
16910 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
16920 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
16930 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
16940 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
16950 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
16960 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
16970 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
16980 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
16990 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
169a0 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
169b0 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
169c0 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
169d0 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
169e0 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
169f0 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
16a00 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
16a10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
16a20 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
16a30 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
16a40 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
16a50 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
16a60 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
16a70 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
16a80 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
16a90 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
16aa0 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
16ab0 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
16ac0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
16ad0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
16ae0 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
16af0 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
16b00 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
16b10 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
16b20 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
16b30 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
16b40 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
16b50 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
16b60 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
16b70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
16b80 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
16b90 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
16ba0 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
16bb0 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
16bc0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
16bd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
16be0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
16bf0 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
16c00 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
16c10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
16c20 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
16c30 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
16c40 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
16c50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c70 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
16c80 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
16c90 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
16ca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16cb0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
16cc0 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
16cd0 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
16ce0 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
16cf0 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
16d00 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
16d10 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
16d20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16d40 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
16d50 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
16d60 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
16d70 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
16d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
16d90 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
16da0 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
16db0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
16dc0 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
16dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
16de0 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
16df0 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
16e00 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16e20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
16e30 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
16e40 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
16e50 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
16e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
16e70 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
16e80 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
16e90 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16eb0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
16ec0 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
16ed0 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
16ee0 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
16ef0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
16f00 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
16f10 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
16f20 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
16f30 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
16f40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
16f50 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
16f60 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69 66 64 65   synced */.#ifde
16f70 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
16f80 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a 72 6e 6c  EC.  /* The jrnl
16f90 45 6e 63 20 66 6c 61 67 20 69 73 20 74 72 75 65  Enc flag is true
16fa0 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70 61 67 65   if Journal page
16fb0 73 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  s should be pass
16fc0 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20  ed through.  ** 
16fd0 74 68 65 20 63 6f 64 65 63 2e 20 20 49 74 20 69  the codec.  It i
16fe0 73 20 66 61 6c 73 65 20 66 6f 72 20 70 75 72 65  s false for pure
16ff0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
17000 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  als. */.  const 
17010 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d 20 28 69  int jrnlEnc = (i
17020 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 50 61  sMainJrnl || pPa
17030 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
17040 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  y==0);.#endif.. 
17050 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e   assert( (isMain
17060 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20  Jrnl&~1)==0 );  
17070 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e      /* isMainJrn
17080 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  l is 0 or 1 */. 
17090 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65   assert( (isSave
170a0 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  pnt&~1)==0 );   
170b0 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74      /* isSavepnt
170c0 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
170d0 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72  assert( isMainJr
170e0 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20  nl || pDone );  
170f0 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61     /* pDone alwa
17100 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a  ys used on sub-j
17110 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73  ournals */.  ass
17120 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c  ert( isSavepnt |
17130 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20  | pDone==0 );   
17140 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75  /* pDone never u
17150 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70  sed on non-savep
17160 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61  oint */..  aData
17170 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
17180 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20  pace;.  assert( 
17190 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20  aData );        
171a0 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
171b0 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
171c0 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
171d0 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  d */.  assert( p
171e0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
171f0 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69  r)==0 || (!isMai
17200 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70  nJrnl && isSavep
17210 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74  nt) );..  /* Eit
17220 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69 73  her the state is
17230 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 41   greater than PA
17240 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
17250 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74 69  MOD (a transacti
17260 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65  on .  ** or save
17270 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64  point rollback d
17280 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75 65  one at the reque
17290 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  st of the caller
172a0 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a  ) or this is.  *
172b0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
172c0 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20  rollback. If it 
172d0 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
172e0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
172f0 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20  ager.  ** is in 
17300 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68  state OPEN and h
17310 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56  olds an EXCLUSIV
17320 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72  E lock. Hot-jour
17330 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  nal rollback.  *
17340 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f  * only reads fro
17350 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
17360 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d  al, not the sub-
17370 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
17380 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17390 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
173a0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
173b0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
173c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
173d0 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65  PEN && pPager->e
173e0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
173f0 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73  LOCK).  );.  ass
17400 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
17410 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
17420 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73  R_CACHEMOD || is
17430 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f  MainJrnl );..  /
17440 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20  * Read the page 
17450 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
17460 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f  data from the jo
17470 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
17480 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20  rnal.  ** file. 
17490 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
174a0 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
174b0 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  er if an IO erro
174c0 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20  r occurs..  */. 
174d0 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e   jfd = isMainJrn
174e0 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  l ? pPager->jfd 
174f0 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a  : pPager->sjfd;.
17500 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
17510 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c  s(jfd, *pOffset,
17520 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
17530 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
17540 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
17550 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
17560 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  fd, (u8*)aData, 
17570 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17580 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b  , (*pOffset)+4);
17590 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
175a0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
175b0 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20  ;.  *pOffset += 
175c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
175d0 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e   + 4 + isMainJrn
175e0 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  l*4;..  /* Sanit
175f0 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
17600 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
17610 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
17620 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
17630 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
17640 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
17650 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
17660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
17670 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
17680 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
17690 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
176a0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
176b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
176c0 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
176d0 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
176e0 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
176f0 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
17700 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
17710 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
17720 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
17730 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
17740 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
17750 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  ( !isSavepnt );.
17760 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17770 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
17780 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61  ( pgno>(Pgno)pPa
17790 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73  ger->dbSize || s
177a0 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
177b0 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b  (pDone, pgno) ){
177c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
177d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
177e0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
177f0 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
17800 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65  ts(jfd, (*pOffse
17810 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  t)-4, &cksum);. 
17820 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
17830 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21  rn rc;.    if( !
17840 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67  isSavepnt && pag
17850 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
17860 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b   (u8*)aData)!=ck
17870 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
17880 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
17890 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
178a0 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68 61   If this page ha
178b0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
178c0 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f 72  layed back befor
178d0 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  e during the cur
178e0 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  rent.  ** rollba
178f0 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62  ck, then don't b
17900 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74  other to play it
17910 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a   back again..  *
17920 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  /.  if( pDone &&
17930 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
17940 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
17950 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
17960 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
17970 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  c;.  }..  /* Whe
17980 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70  n playing back p
17990 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74  age 1, restore t
179a0 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74  he nReserve sett
179b0 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
179c0 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72  gno==1 && pPager
179d0 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38  ->nReserve!=((u8
179e0 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a  *)aData)[20] ){.
179f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
17a00 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61  erve = ((u8*)aDa
17a10 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67  ta)[20];.    pag
17a20 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
17a30 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
17a40 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
17a50 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74  in CACHEMOD stat
17a60 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
17a70 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
17a80 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
17a90 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
17aa0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
17ab0 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
17ac0 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
17ad0 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
17ae0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
17af0 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
17b00 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
17b10 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
17b20 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
17b30 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
17b40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
17b50 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
17b60 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
17b70 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
17b80 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
17b90 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
17ba0 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
17bb0 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
17bc0 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
17bd0 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
17be0 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
17bf0 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
17c00 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
17c10 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
17c20 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
17c30 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
17c40 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
17c50 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
17c60 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
17c70 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
17c80 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
17c90 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
17ca0 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52  WRITER_DBMOD, WR
17cb0 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72  ITER_FINISHED or
17cc0 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65   OPEN state, the
17cd0 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a  n we update the.
17ce0 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65    ** pager cache
17cf0 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e   if it exists an
17d00 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
17d10 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
17d20 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e  n marked .  ** n
17d30 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20  ot dirty. Since 
17d40 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c  this code is onl
17d50 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41  y executed in PA
17d60 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66  GER_OPEN state f
17d70 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  or.  ** a hot-jo
17d80 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
17d90 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
17da0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63   that the page-c
17db0 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20  ache is empty.  
17dc0 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
17dd0 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65  is in OPEN state
17de0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
17df0 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
17e00 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
17e10 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
17e20 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
17e30 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
17e40 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
17e50 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
17e60 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
17e70 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
17e80 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
17e90 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
17ea0 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
17eb0 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
17ec0 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
17ed0 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
17ee0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
17ef0 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
17f00 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
17f10 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
17f20 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
17f30 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
17f40 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
17f50 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
17f60 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
17f70 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
17f80 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
17f90 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
17fa0 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
17fb0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
17fc0 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
17fd0 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
17fe0 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
17ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
18000 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
18010 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
18020 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
18030 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
18040 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
18050 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
18060 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
18070 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
18080 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
18090 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
180a0 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
180b0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
180c0 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
180d0 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
180e0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
180f0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
18100 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
18110 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
18120 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
18130 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
18140 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
18150 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
18160 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
18170 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
18180 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
18190 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
181a0 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
181b0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
181c0 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
181d0 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
181e0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
181f0 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
18200 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
18210 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
18220 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
18230 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
18240 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
18250 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
18260 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
18270 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
18280 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
18290 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
182a0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
182b0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  ager, pgno);.  }
182c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
182d0 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
182e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
182f0 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
18300 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c 20 70 50   || pPg==0 || pP
18310 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
18320 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
18330 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
18340 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20  e %d hash(%08x) 
18350 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
18360 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
18370 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
18380 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
18390 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61  pageSize, (u8*)a
183a0 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20  Data),.         
183b0 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d    (isMainJrnl?"m
183c0 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75  ain-journal":"su
183d0 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29  b-journal").  ))
183e0 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  ;.  if( isMainJr
183f0 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63  nl ){.    isSync
18400 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ed = pPager->noS
18410 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74  ync || (*pOffset
18420 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
18430 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65  nalHdr);.  }else
18440 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
18450 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28   (pPg==0 || 0==(
18460 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
18470 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a  DR_NEED_SYNC));.
18480 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e    }.  if( isOpen
18490 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
184a0 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
184b0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
184c0 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
184d0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
184e0 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79  OPEN).   && isSy
184f0 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36  nced.  ){.    i6
18500 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31  4 ofst = (pgno-1
18510 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
18520 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73  ageSize;.    tes
18530 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70 6e  tcase( !isSavepn
18540 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20 28  t && pPg!=0 && (
18550 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
18560 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29  _NEED_SYNC)!=0 )
18570 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
18580 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
18590 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 57 72  r) );..    /* Wr
185a0 69 74 65 20 74 68 65 20 64 61 74 61 20 72 65 61  ite the data rea
185b0 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
185c0 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  al back into the
185d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
185e0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75      ** This is u
185f0 73 75 61 6c 6c 79 20 73 61 66 65 20 65 76 65 6e  sually safe even
18600 20 66 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65   for an encrypte
18610 64 20 64 61 74 61 62 61 73 65 20 2d 20 61 73 20  d database - as 
18620 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
18630 77 61 73 20 65 6e 63 72 79 70 74 65 64 20 62 65  was encrypted be
18640 66 6f 72 65 20 69 74 20 77 61 73 20 77 72 69 74  fore it was writ
18650 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
18660 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 65 78 63  al file. The exc
18670 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73  eption.    ** is
18680 20 69 66 20 74 68 65 20 64 61 74 61 20 77 61 73   if the data was
18690 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
186a0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62  an in-memory sub
186b0 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 74 68 61  -journal. In tha
186c0 74 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 69 74  t.    ** case it
186d0 20 6d 75 73 74 20 62 65 20 65 6e 63 72 79 70 74   must be encrypt
186e0 65 64 20 68 65 72 65 20 62 65 66 6f 72 65 20 69  ed here before i
186f0 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
18700 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
18710 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a 2f 0a 23    ** file.  */.#
18720 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
18730 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 21  _CODEC.    if( !
18740 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20 20 20  jrnlEnc ){.     
18750 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
18760 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
18770 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rc=SQLITE_NOMEM_
18780 42 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a 20 20  BKPT, aData);.  
18790 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
187a0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
187b0 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c  fd, (u8 *)aData,
187c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
187d0 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 20 20  e, ofst);.      
187e0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
187f0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
18800 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
18810 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  KPT);.    }else.
18820 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
18830 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
18840 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a  Pager->fd, (u8 *
18850 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
18860 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
18870 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70  ..    if( pgno>p
18880 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
18890 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
188a0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
188b0 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pgno;.    }.    
188c0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63  if( pPager->pBac
188d0 6b 75 70 20 29 7b 0a 23 69 66 64 65 66 20 53 51  kup ){.#ifdef SQ
188e0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
188f0 20 20 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63       if( jrnlEnc
18900 20 29 7b 0a 20 20 20 20 20 20 20 20 43 4f 44 45   ){.        CODE
18910 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
18920 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
18930 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
18940 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18950 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
18960 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
18970 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29  gno, (u8*)aData)
18980 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32  ;.        CODEC2
18990 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
189a0 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49  pgno, 7, rc=SQLI
189b0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 61 44  TE_NOMEM_BKPT,aD
189c0 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ata);.      }els
189d0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73  e.#endif.      s
189e0 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
189f0 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
18a00 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61  up, pgno, (u8*)a
18a10 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
18a20 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e  else if( !isMain
18a30 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29  Jrnl && pPg==0 )
18a40 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
18a50 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
18a60 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  f a savepoint an
18a70 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77  d data was not w
18a80 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a  ritten to.    **
18a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
18aa0 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
18ab0 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65  t in-memory, the
18ac0 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61  re is a potentia
18ad0 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  l.    ** problem
18ae0 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20  . When the page 
18af0 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20  is next fetched 
18b00 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
18b10 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20  yer, it .    ** 
18b20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
18b30 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
18b40 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  ile, which may o
18b50 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20  r may not be .  
18b60 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20    ** current. . 
18b70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
18b80 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20  re are a couple 
18b90 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  of different way
18ba0 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  s this can happe
18bb0 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65  n. All are quite
18bc0 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e  .    ** obscure.
18bd0 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   When running in
18be0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64   synchronous mod
18bf0 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e, this can only
18c00 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20   happen .    ** 
18c10 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
18c20 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
18c30 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
18c40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
18c50 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70   then.    ** pop
18c60 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76  ulated, then mov
18c70 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
18c80 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e  PagerMovepage().
18c90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
18ca0 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
18cb0 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  o add an in-memo
18cc0 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  ry page to the c
18cd0 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ache containing.
18ce0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20      ** the data 
18cf0 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74  just read from t
18d00 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
18d10 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
18d20 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61   dirty .    ** a
18d30 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  nd if the pager 
18d40 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e  requires a journ
18d50 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61  al-sync, then ma
18d60 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a  rk the page as .
18d70 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67      ** requiring
18d80 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20   a journal-sync 
18d90 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69  before it is wri
18da0 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
18db0 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
18dc0 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nt );.    assert
18dd0 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  ( (pPager->doNot
18de0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
18df0 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29  G_ROLLBACK)==0 )
18e00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
18e10 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c  NotSpill |= SPIL
18e20 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  LFLAG_ROLLBACK;.
18e30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18e40 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
18e50 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
18e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
18e70 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
18e80 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
18e90 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20  LBACK)!=0 );.   
18ea0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
18eb0 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41  ill &= ~SPILLFLA
18ec0 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
18ed0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18ee0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
18ef0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
18f00 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
18f10 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
18f20 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
18f30 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65  should ever be e
18f40 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64  xplicitly rolled
18f50 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
18f60 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20   use, except.   
18f70 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77   ** for page 1 w
18f80 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
18f90 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
18fa0 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
18fb0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
18fc0 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77  base active. How
18fd0 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65  ever such a page
18fe0 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
18ff0 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ack as a result.
19000 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74      ** of an int
19010 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75  ernal error resu
19020 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f  lting in an auto
19030 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20  matic call to.  
19040 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
19050 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  rRollback()..   
19060 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
19070 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d  ata;.    pData =
19080 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
19090 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28   memcpy(pData, (
190a0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
190b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
190c0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
190d0 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 2f 2a  ter(pPg);.    /*
190e0 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 74   It used to be t
190f0 68 61 74 20 73 71 6c 69 74 65 33 50 63 61 63 68  hat sqlite3Pcach
19100 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 20  eMakeClean(pPg) 
19110 77 61 73 20 63 61 6c 6c 65 64 20 68 65 72 65 2e  was called here.
19120 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 74 68 61    But.    ** tha
19130 74 20 63 61 6c 6c 20 77 61 73 20 64 61 6e 67 65  t call was dange
19140 72 6f 75 73 20 61 6e 64 20 68 61 64 20 6e 6f 20  rous and had no 
19150 64 65 74 65 63 74 61 62 6c 65 20 62 65 6e 65 66  detectable benef
19160 69 74 20 73 69 6e 63 65 20 74 68 65 20 63 61 63  it since the cac
19170 68 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 72  he.    ** is nor
19180 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64 20 62 79  mally cleaned by
19190 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
191a0 65 61 6e 41 6c 6c 28 29 20 61 66 74 65 72 20 72  eanAll() after r
191b0 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 6f 0a 20  ollback and so. 
191c0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
191d0 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 20 20 70  emoved. */.    p
191e0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
191f0 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
19200 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
19210 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
19220 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
19230 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
19240 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
19250 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
19260 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
19270 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
19280 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
19290 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
192a0 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
192b0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
192c0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
192d0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
192e0 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
192f0 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
19300 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  #if SQLITE_HAS_C
19310 4f 44 45 43 0a 20 20 20 20 69 66 28 20 6a 72 6e  ODEC.    if( jrn
19320 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43 31 28 70  lEnc ){ CODEC1(p
19330 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
19340 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  g->pgno, 3, rc=S
19350 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
19360 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20  ); }.#endif.    
19370 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
19380 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
19390 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
193a0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
193b0 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
193c0 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
193d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
193e0 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
193f0 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
19400 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
19410 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
19420 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
19430 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
19440 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
19450 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
19460 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
19470 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19480 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
19490 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
194a0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
194b0 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
194c0 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
194d0 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
194e0 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
194f0 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
19500 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
19510 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
19520 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
19530 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
19540 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
19550 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
19560 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
19570 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
19580 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
19590 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
195a0 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
195b0 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
195c0 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
195d0 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
195e0 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
195f0 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
19600 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
19610 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
19620 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
19630 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
19640 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
19650 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
19660 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
19670 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
19680 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
19690 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
196a0 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
196b0 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
196c0 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
196d0 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
196e0 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
196f0 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
19700 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
19710 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
19720 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
19730 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
19740 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
19750 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
19760 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
19770 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
19780 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
19790 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
197a0 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
197b0 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
197c0 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
197d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
197e0 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
197f0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
19800 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
19810 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
19820 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
19830 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
19840 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
19850 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
19860 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
19870 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
19880 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
19890 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
198a0 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
198b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
198c0 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
198d0 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
198e0 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
198f0 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
19900 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
19910 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
19920 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
19930 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
19940 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
19950 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
19960 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
19970 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
19980 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
19990 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
199a0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
199b0 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
199c0 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
199d0 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
199e0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
199f0 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
19a00 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
19a10 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
19a20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
19a30 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
19a40 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
19a50 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
19a60 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
19a70 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
19a80 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
19a90 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
19aa0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
19ab0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
19ac0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
19ad0 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
19ae0 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
19af0 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
19b00 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
19b10 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
19b20 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
19b30 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
19b40 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
19b50 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
19b60 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
19b70 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
19b80 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
19b90 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19bb0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
19bc0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
19bd0 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
19be0 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
19bf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
19c00 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
19c10 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
19c20 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
19c30 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
19c40 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19c50 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
19c60 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
19c70 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
19c80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19c90 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
19ca0 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
19cb0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
19cc0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19cd0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
19ce0 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nal;           /
19cf0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65  * Pointer to one
19d00 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20   journal within 
19d10 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  MJ file */.  cha
19d20 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20  r *zMasterPtr;  
19d30 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
19d40 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e  to hold MJ filen
19d50 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e  ame from a journ
19d60 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
19d70 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20   nMasterPtr;    
19d80 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74         /* Amount
19d90 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
19da0 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74  ted to zMasterPt
19db0 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  r[] */..  /* All
19dc0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
19dd0 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61  both the pJourna
19de0 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69  l and pMaster fi
19df0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a  le descriptors..
19e00 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66    ** If successf
19e10 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73  ul, open the mas
19e20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19e30 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20   for reading..  
19e40 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28  */.  pMaster = (
19e50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73  sqlite3_file *)s
19e60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
19e70 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
19e80 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c  * 2);.  pJournal
19e90 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
19ea0 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74   *)(((u8 *)pMast
19eb0 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73  er) + pVfs->szOs
19ec0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d  File);.  if( !pM
19ed0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20  aster ){.    rc 
19ee0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
19ef0 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
19f00 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
19f10 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
19f20 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
19f30 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
19f40 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
19f50 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
19f60 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
19f70 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
19f80 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
19f90 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
19fa0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
19fb0 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
19fc0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
19fd0 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
19fe0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
19ff0 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  m.  ** sqlite3_m
1a000 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
1a010 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
1a020 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f  rJournal.   Also
1a030 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66   obtain.  ** suf
1a040 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69  ficient space (i
1a050 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f  n zMasterPtr) to
1a060 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
1a070 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a  of master.  ** j
1a080 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74  ournal files ext
1a090 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75  racted from regu
1a0a0 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  lar rollback-jou
1a0b0 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rnals..  */.  rc
1a0c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1a0d0 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
1a0e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
1a0f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a100 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
1a110 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73  ster_out;.  nMas
1a120 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
1a130 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
1a140 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
1a150 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d  sqlite3Malloc(nM
1a160 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
1a170 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a  MasterPtr + 1);.
1a180 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
1a190 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
1a1a0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1a1b0 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  KPT;.    goto de
1a1c0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
1a1d0 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
1a1e0 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
1a1f0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
1a200 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
1a210 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
1a220 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
1a230 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
1a240 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
1a250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a260 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
1a270 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
1a280 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
1a290 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
1a2a0 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
1a2b0 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
1a2c0 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
1a2d0 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
1a2e0 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
1a2f0 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
1a300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1a310 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
1a320 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
1a330 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
1a340 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
1a350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a360 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
1a370 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
1a380 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
1a390 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
1a3a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
1a3b0 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
1a3c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
1a3d0 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
1a3e0 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
1a3f0 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
1a400 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
1a410 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
1a420 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
1a430 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
1a440 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a450 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
1a460 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
1a470 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
1a480 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1a490 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
1a4a0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
1a4b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a4c0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
1a4d0 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
1a4e0 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
1a4f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a500 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a510 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
1a520 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
1a530 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
1a540 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
1a550 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
1a560 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
1a570 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
1a580 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
1a590 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a5a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a5b0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
1a5c0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
1a5d0 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
1a5e0 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
1a5f0 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
1a600 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
1a610 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
1a620 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
1a630 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
1a640 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
1a650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
1a660 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
1a670 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
1a680 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
1a690 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
1a6a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
1a6b0 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
1a6c0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
1a6d0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
1a6e0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
1a6f0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
1a700 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
1a710 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
1a720 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
1a730 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
1a740 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
1a750 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
1a760 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
1a770 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
1a780 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1a790 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
1a7a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a7b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1a7c0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1a7d0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
1a7e0 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
1a7f0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
1a800 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
1a810 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
1a820 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
1a830 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
1a840 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
1a850 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
1a860 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
1a870 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
1a880 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
1a890 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
1a8a0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1a8b0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
1a8c0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
1a8d0 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44  t in either.** D
1a8e0 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  BMOD or OPEN sta
1a8f0 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
1a900 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  n is a no-op. Ot
1a910 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a  herwise, the siz
1a920 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  e .** of the fil
1a930 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
1a940 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61  nPage pages (nPa
1a950 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
1a960 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20  ize bytes). .** 
1a970 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
1a980 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
1a990 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
1a9a0 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
1a9b0 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
1a9c0 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
1a9d0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
1a9e0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
1a9f0 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
1aa00 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e  that the file on
1aa10 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72   disk is smaller
1aa20 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20   than .** nPage 
1aa30 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72  pages. Some oper
1aa40 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
1aa50 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
1aa60 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
1aa70 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20   .** you try to 
1aa80 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
1aa90 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
1aaa0 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
1aab0 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   it .** currentl
1aac0 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20  y is, so detect 
1aad0 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72  this case and wr
1aae0 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72  ite a single zer
1aaf0 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68  o byte to .** th
1ab00 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77  e end of the new
1ab10 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a   file instead..*
1ab20 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1ab30 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ul, return SQLIT
1ab40 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65  E_OK. If an IO e
1ab50 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1ab60 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74  e modifying.** t
1ab70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ab80 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
1ab90 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
1aba0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
1abb0 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
1abc0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
1abd0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
1abe0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1abf0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
1ac00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
1ac10 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
1ac20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ac30 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52  >eState!=PAGER_R
1ac40 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66  EADER );.  .  if
1ac50 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1ac60 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61  >fd) .   && (pPa
1ac70 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1ac80 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1ac90 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1aca0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a  e==PAGER_OPEN) .
1acb0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72    ){.    i64 cur
1acc0 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
1acd0 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  e;.    int szPag
1ace0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
1acf0 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Size;.    assert
1ad00 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
1ad10 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1ad20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  );.    /* TODO: 
1ad30 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73  Is it safe to us
1ad40 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
1ad50 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20  ze here? */.    
1ad60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1ad70 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1ad80 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
1ad90 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
1ada0 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67  szPage*(i64)nPag
1adb0 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
1adc0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
1add0 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
1ade0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
1adf0 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
1ae00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
1ae10 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
1ae20 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
1ae30 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
1ae40 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72 65  }else if( (curre
1ae50 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d  ntSize+szPage)<=
1ae60 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
1ae70 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20     char *pTmp = 
1ae80 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1ae90 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e;.        memse
1aea0 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67  t(pTmp, 0, szPag
1aeb0 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
1aec0 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
1aed0 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e  zPage) == curren
1aee0 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
1aef0 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
1af00 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63  ize-szPage) >  c
1af10 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
1af20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1af30 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1af40 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61  ->fd, pTmp, szPa
1af50 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61  ge, newSize-szPa
1af60 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1af70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1af80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1af90 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
1afa0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
1afb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1afc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1afd0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e  .** Return a san
1afe0 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  itized version o
1aff0 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  f the sector-siz
1b000 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69  e of OS file pFi
1b010 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  le. The.** retur
1b020 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72 61  n value is guara
1b030 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74  nteed to lie bet
1b040 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f  ween 32 and MAX_
1b050 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a  SECTOR_SIZE..*/.
1b060 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f  int sqlite3Secto
1b070 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1b080 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
1b090 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33  t iRet = sqlite3
1b0a0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69  OsSectorSize(pFi
1b0b0 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c  le);.  if( iRet<
1b0c0 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d  32 ){.    iRet =
1b0d0 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66   512;.  }else if
1b0e0 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f  ( iRet>MAX_SECTO
1b0f0 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
1b100 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
1b110 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
1b120 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43    iRet = MAX_SEC
1b130 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20  TOR_SIZE;.  }.  
1b140 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a  return iRet;.}..
1b150 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
1b160 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
1b170 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
1b180 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
1b190 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
1b1a0 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
1b1b0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
1b1c0 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
1b1d0 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
1b1e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b1f0 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
1b200 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
1b210 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1b220 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
1b230 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
1b240 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
1b250 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
1b260 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
1b270 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
1b280 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
1b290 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
1b2a0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1b2b0 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
1b2c0 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
1b2d0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
1b2e0 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
1b2f0 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
1b300 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1b310 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
1b320 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
1b330 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
1b340 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
1b350 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
1b360 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
1b370 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
1b380 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
1b390 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
1b3a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
1b3b0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
1b3c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
1b3d0 20 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f   has the SQLITE_
1b3e0 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1b3f0 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72  OVERWRITE proper
1b400 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20  ty, then set.** 
1b410 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1b420 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73  ctor size to its
1b430 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28   minimum value (
1b440 35 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f  512).  The purpo
1b450 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d  se of.** pPager-
1b460 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74  >sectorSize is t
1b470 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c  o define the "bl
1b480 61 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62  ast radius" of b
1b490 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67  ytes that.** mig
1b4a0 68 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63  ht change if a c
1b4b0 72 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c  rash occurs whil
1b4c0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73  e writing to a s
1b4d0 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a  ingle byte in.**
1b4e0 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75   that range.  Bu
1b4f0 74 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45  t with POWERSAFE
1b500 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20  _OVERWRITE, the 
1b510 62 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20  blast radius is 
1b520 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73  zero.** (that is
1b530 20 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f   what POWERSAFE_
1b540 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29  OVERWRITE means)
1b550 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65  , so we minimize
1b560 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73   the sector.** s
1b570 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61  ize.  For backwa
1b580 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
1b590 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  y of the rollbac
1b5a0 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  k journal file f
1b5b0 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e  ormat,.** we can
1b5c0 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65  not reduce the e
1b5d0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1b5e0 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a  size below 512..
1b5f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1b600 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
1b610 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
1b620 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1b630 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1b640 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1b650 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1b660 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28  tempFile.   || (
1b670 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1b680 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1b690 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20  Pager->fd) & .  
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1b6b0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1b6c0 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30  FE_OVERWRITE)!=0
1b6d0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  .  ){.    /* Sec
1b6e0 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
1b6f0 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
1b700 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
1b710 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
1b720 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
1b730 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
1b740 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
1b750 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
1b760 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
1b770 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a  ll segfault. */.
1b780 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
1b790 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
1b7a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
1b7b0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
1b7c0 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a  sqlite3SectorSiz
1b7d0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
1b7e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
1b7f0 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
1b800 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
1b810 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
1b820 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
1b830 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
1b840 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
1b850 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
1b860 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
1b870 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
1b880 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
1b890 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
1b8a0 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
1b8b0 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
1b8c0 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
1b8d0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1b8e0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1b8f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1b900 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
1b910 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
1b920 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
1b930 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
1b940 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1b950 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
1b960 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
1b970 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
1b980 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
1b990 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
1b9a0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1b9b0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1b9c0 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
1b9d0 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
1b9e0 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
1b9f0 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
1ba00 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
1ba10 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1ba20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
1ba30 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
1ba40 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
1ba50 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
1ba60 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
1ba70 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1ba80 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1ba90 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54   sector size.  T
1baa0 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  he header.**    
1bab0 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20     is this many 
1bac0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
1bad0 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62  *  (6)  4 byte b
1bae0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1baf0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  r which is the p
1bb00 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37  age size..**  (7
1bb10 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20  )  zero padding 
1bb20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  out to the next 
1bb30 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20  sector size..** 
1bb40 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (8)  Zero or mo
1bb50 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
1bb60 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
1bb70 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
1bb80 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
1bb90 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
1bba0 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
1bbb0 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
1bbc0 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
1bbd0 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
1bbe0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
1bbf0 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
1bc00 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
1bc10 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69  an the first 7 i
1bc20 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
1bc30 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
1bc40 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
1bc50 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38  nstance of the 8
1bc60 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
1bc70 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
1bc80 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
1bc90 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
1bca0 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
1bcb0 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
1bcc0 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
1bcd0 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
1bce0 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
1bcf0 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1bd00 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
1bd10 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
1bd20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1bd30 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
1bd40 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
1bd50 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
1bd60 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
1bd70 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
1bd80 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
1bd90 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
1bda0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1bdb0 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
1bdc0 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
1bdd0 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
1bde0 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
1bdf0 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
1be00 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
1be10 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
1be20 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
1be30 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
1be40 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
1be50 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
1be60 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
1be70 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
1be80 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
1be90 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
1bea0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
1beb0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
1bec0 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
1bed0 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
1bee0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
1bef0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
1bf00 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
1bf10 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
1bf20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
1bf30 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
1bf40 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
1bf50 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
1bf60 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
1bf70 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
1bf80 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
1bf90 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
1bfa0 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
1bfb0 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
1bfc0 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
1bfd0 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
1bfe0 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
1bff0 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
1c000 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
1c010 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
1c020 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
1c030 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
1c040 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1c050 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
1c060 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
1c070 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
1c080 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
1c090 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
1c0a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1c0b0 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
1c0c0 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
1c0d0 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
1c0e0 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
1c0f0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
1c100 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
1c110 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
1c120 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
1c130 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
1c140 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
1c150 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
1c160 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
1c170 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
1c180 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1c190 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1c1a0 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61  .** The isHot pa
1c1b0 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
1c1c0 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72  s that we are tr
1c1d0 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ying to rollback
1c1e0 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68   a journal.** th
1c1f0 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f  at might be a ho
1c200 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20  t journal.  Or, 
1c210 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  it could be that
1c220 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1c230 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65  .** preserved be
1c240 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c  cause of JOURNAL
1c250 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20  MODE_PERSIST or 
1c260 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
1c270 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20  CATE..** If the 
1c280 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69  journal really i
1c290 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65  s hot, reset the
1c2a0 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69   pager cache pri
1c2b0 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61  or rolling.** ba
1c2c0 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20  ck any content. 
1c2d0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1c2e0 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73  is merely persis
1c2f0 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69  tent, no reset i
1c300 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s.** needed..*/.
1c310 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1c320 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
1c330 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
1c340 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
1c350 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1c360 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
1c370 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
1c380 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1c390 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1c3a0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1c3b0 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
1c3c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c3d0 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
1c3e0 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
1c3f0 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
1c400 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
1c410 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
1c420 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
1c430 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c440 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
1c450 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
1c460 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
1c470 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c480 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1c490 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
1c4a0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  ne */.  int res 
1c4b0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1c4c0 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
1c4d0 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41  ed by sqlite3OsA
1c4e0 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61  ccess() */.  cha
1c4f0 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
1c500 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c510 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1c520 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20  file if any */. 
1c530 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65   int needPagerRe
1c540 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  set;      /* Tru
1c550 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20  e to reset page 
1c560 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70  prior to first p
1c570 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  age rollback */.
1c580 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20    int nPlayback 
1c590 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f  = 0;       /* To
1c5a0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
1c5b0 67 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ges restored fro
1c5c0 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20  m journal */..  
1c5d0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1c5e0 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
1c5f0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
1c600 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
1c610 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
1c620 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
1c630 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
1c640 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
1c650 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1c660 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1c670 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
1c680 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1c690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
1c6a0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c6b0 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
1c6c0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1c6d0 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
1c6e0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
1c6f0 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
1c700 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1c710 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
1c720 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
1c730 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
1c740 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
1c750 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
1c760 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
1c770 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
1c780 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
1c790 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
1c7a0 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
1c7b0 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
1c7c0 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
1c7d0 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
1c7e0 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
1c7f0 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
1c800 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
1c810 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
1c820 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
1c830 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
1c840 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
1c850 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1c860 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
1c870 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d  s_unix.c,.  ** m
1c880 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1c890 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1c8a0 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1c8b0 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1c8c0 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1c8d0 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1c8e0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1c8f0 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1c900 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1c910 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1c920 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1c930 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1c940 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1c950 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1c960 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1c970 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1c980 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1c990 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1c9a0 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1c9b0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1c9c0 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1c9d0 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1c9e0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1c9f0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1ca00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ca10 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1ca20 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1ca30 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1ca40 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1ca50 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1ca60 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1ca70 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1ca80 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1ca90 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1caa0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1cab0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1cac0 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1cad0 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1cae0 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1caf0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1cb00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1cb10 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1cb20 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1cb30 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1cb40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1cb50 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1cb60 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1cb70 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1cb80 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1cb90 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1cba0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1cbb0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1cbc0 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1cbd0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1cbe0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1cbf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1cc00 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1cc10 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1cc20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1cc30 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1cc40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1cc50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cc60 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1cc70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1cc80 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1cc90 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1cca0 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1ccb0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1ccc0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1ccd0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1cce0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1ccf0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1cd00 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1cd10 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1cd20 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1cd30 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1cd40 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1cd50 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1cd60 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1cd70 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1cd80 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1cd90 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1cda0 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1cdb0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1cdc0 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1cdd0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1cde0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1cdf0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1ce00 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1ce10 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1ce20 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1ce30 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1ce40 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1ce50 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1ce60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ce70 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1ce80 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1ce90 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1cea0 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1ceb0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1cec0 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1ced0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1cee0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1cef0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1cf00 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1cf10 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1cf20 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1cf30 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1cf40 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1cf50 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1cf60 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1cf70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1cf80 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1cf90 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1cfa0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1cfb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1cfc0 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1cfd0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1cfe0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1cff0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1d000 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1d010 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1d020 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1d030 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1d040 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1d050 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1d060 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1d070 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1d080 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1d090 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1d0a0 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1d0b0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1d0c0 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1d0d0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1d0e0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1d0f0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1d100 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1d110 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1d120 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1d130 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1d140 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1d150 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1d160 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1d170 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1d180 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1d190 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1d1a0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1d1b0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1d1c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1d1d0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1d1e0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1d1f0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1d200 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1d210 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1d220 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d230 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1d240 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1d250 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1d260 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1d270 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1d280 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1d290 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1d2a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1d2b0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1d2c0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1d2d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1d2e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1d2f0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1d300 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1d310 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1d320 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1d330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1d340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d350 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1d360 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1d370 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1d380 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1d390 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1d3a0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1d3b0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1d3c0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1d3d0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1d3e0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1d3f0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1d400 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1d410 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1d420 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1d430 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1d440 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1d450 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1d460 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1d470 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1d480 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1d490 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1d4a0 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1d4b0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1d4c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1d4d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d4e0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b        nPlayback+
1d4f0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
1d500 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1d510 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1d520 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1d530 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1d540 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1d550 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1d560 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1d570 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1d580 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1d590 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1d5a0 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1d5b0 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1d5c0 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1d5d0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1d5e0 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1d5f0 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1d600 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1d610 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1d620 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1d630 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1d640 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1d650 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1d660 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1d670 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1d680 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1d690 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1d6a0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1d6b0 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1d6c0 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1d6d0 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1d6e0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1d6f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1d700 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1d710 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1d720 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1d730 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1d740 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1d750 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1d760 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1d770 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1d780 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1d790 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1d7a0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1d7b0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1d7c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1d7d0 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1d7e0 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1d7f0 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1d800 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1d810 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1d820 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1d830 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1d840 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1d850 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1d860 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1d870 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1d880 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1d890 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1d8a0 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1d8b0 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1d8c0 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1d8d0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1d8e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d8f0 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1d900 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1d910 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1d920 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1d930 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1d940 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1d950 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1d960 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1d970 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1d980 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1d990 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1d9a0 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1d9b0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1d9c0 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1d9d0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1d9e0 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67  DEBUG.  if( pPag
1d9f0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1da00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
1da10 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
1da20 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
1da30 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1da40 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65  ANGED,0);.  }.#e
1da50 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1da60 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1da70 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1da80 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1da90 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1daa0 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1dab0 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1dac0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1dad0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1dae0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1daf0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1db00 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1db10 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1db20 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1db30 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1db40 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1db50 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1db60 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1db70 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1db80 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1db90 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1dba0 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1dbb0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1dbc0 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1dbd0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1dbe0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1dbf0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1dc00 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1dc10 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1dc20 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1dc30 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1dc40 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1dc50 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1dc60 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1dc70 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1dc80 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1dc90 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1dca0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1dcb0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1dcc0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1dcd0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1dce0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1dcf0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1dd00 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1dd10 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1dd20 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1dd30 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1dd40 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1dd50 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1dd60 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1dd70 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1dd80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dd90 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1dda0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1ddb0 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1ddc0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1ddd0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1dde0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ddf0 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c  agerSync(pPager,
1de00 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
1de10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1de20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1de30 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
1de40 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
1de50 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20  ]!='\0', 0);.   
1de60 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1de70 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1de80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1de90 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1dea0 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  ] && res ){.    
1deb0 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
1dec0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1ded0 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
1dee0 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
1def0 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
1df00 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
1df10 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
1df20 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1df30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1df40 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
1df50 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
1df60 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
1df70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1df80 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48  );.  }.  if( isH
1df90 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20  ot && nPlayback 
1dfa0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
1dfb0 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  og(SQLITE_NOTICE
1dfc0 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
1dfd0 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25 64  K, "recovered %d
1dfe0 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c   pages from %s",
1dff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e000 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67   nPlayback, pPag
1e010 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
1e020 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
1e030 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1e040 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
1e050 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
1e060 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
1e070 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
1e080 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1e090 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
1e0a0 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
1e0b0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
1e0c0 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
1e0d0 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1e0e0 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
1e0f0 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
1e100 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1e110 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1e120 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1e130 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
1e140 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
1e150 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
1e160 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
1e170 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
1e180 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
1e190 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1e1a0 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1e1b0 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
1e1c0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
1e1d0 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
1e1e0 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
1e1f0 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
1e200 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
1e210 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
1e220 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
1e230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e240 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
1e250 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1e260 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1e270 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1e280 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
1e290 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1e2a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1e2b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1e2c0 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
1e2d0 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61 6d 65  *pPg, u32 iFrame
1e2e0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1e2f0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1e300 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63  ; /* Pager objec
1e310 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1e320 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20  h page pPg */.  
1e330 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
1e340 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20  >pgno;       /* 
1e350 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72  Page number to r
1e360 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ead */.  int rc 
1e370 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1e380 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e390 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  code */.  int pg
1e3a0 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  sz = pPager->pag
1e3b0 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72  eSize; /* Number
1e3c0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
1e3d0 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
1e3e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1e3f0 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
1e400 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
1e410 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1e420 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64  r->fd) );..#ifnd
1e430 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1e440 41 4c 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20  AL.  if( iFrame 
1e450 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  ){.    /* Try to
1e460 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66   pull the page f
1e470 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68  rom the write-ah
1e480 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  ead log. */.    
1e490 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52  rc = sqlite3WalR
1e4a0 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  eadFrame(pPager-
1e4b0 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70  >pWal, iFrame, p
1e4c0 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  gsz, pPg->pData)
1e4d0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1e4e0 0a 20 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  .  {.#ifdef SQLI
1e4f0 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f  TE_SERVER_EDITIO
1e500 4e 0a 20 20 20 20 75 38 20 2a 70 44 61 74 61 20  N.    u8 *pData 
1e510 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 61 67  = 0;.    if( pag
1e520 65 72 49 73 53 65 72 76 65 72 28 70 50 61 67 65  erIsServer(pPage
1e530 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
1e540 74 65 33 53 65 72 76 65 72 52 65 61 64 50 61 67  te3ServerReadPag
1e550 65 28 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65  e(pPager->pServe
1e560 72 2c 20 70 67 6e 6f 2c 20 26 70 44 61 74 61 29  r, pgno, &pData)
1e570 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  ;.      if( pDat
1e580 61 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  a ){.        mem
1e590 63 70 79 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  cpy(pPg->pData, 
1e5a0 70 44 61 74 61 2c 20 70 67 73 7a 29 3b 0a 20 20  pData, pgsz);.  
1e5b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e5c0 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a  if( pData==0 ){.
1e5d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 36 34  #endif.      i64
1e5e0 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f   iOffset = (pgno
1e5f0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1e600 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
1e610 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1e620 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1e630 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a  pPg->pData, pgsz
1e640 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
1e650 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e660 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1e670 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  D ){.        rc 
1e680 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1e690 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1e6a0 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f  TE_SERVER_EDITIO
1e6b0 4e 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65  N.      if( page
1e6c0 72 49 73 53 65 72 76 65 72 28 70 50 61 67 65 72  rIsServer(pPager
1e6d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
1e6e0 69 74 65 33 53 65 72 76 65 72 45 6e 64 52 65 61  ite3ServerEndRea
1e6f0 64 50 61 67 65 28 70 50 61 67 65 72 2d 3e 70 53  dPage(pPager->pS
1e700 65 72 76 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  erver, pgno);.  
1e710 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
1e720 69 66 0a 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  if..  }..  if( p
1e730 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66  gno==1 ){.    if
1e740 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
1e750 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20   If the read is 
1e760 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  unsuccessful, se
1e770 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73  t the dbFileVers
1e780 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  [] to something.
1e790 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69        ** that wi
1e7a0 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61  ll never be a va
1e7b0 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  lid file version
1e7c0 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  .  dbFileVers[] 
1e7d0 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20  is a copy.      
1e7e0 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e  ** of bytes 24..
1e7f0 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1e800 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33  se.  Bytes 28..3
1e810 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  1 should always 
1e820 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  be.      ** zero
1e830 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
1e840 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1e850 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e  page. Bytes 32..
1e860 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20  35 and 35..39.  
1e870 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1e880 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68   page numbers wh
1e890 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78  ich are never 0x
1e8a0 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
1e8b0 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  lling.      ** p
1e8c0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e8d0 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66  s[] with all 0xf
1e8e0 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  f bytes should s
1e8f0 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
1e900 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
1e910 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
1e920 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
1e930 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
1e940 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
1e950 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
1e960 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
1e970 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
1e980 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
1e990 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
1e9a0 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e  te noise equalin
1e9b0 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
1e9c0 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
1e9d0 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
1e9e0 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
1e9f0 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
1ea00 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
1ea10 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1ea20 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
1ea30 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1ea40 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
1ea50 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
1ea60 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
1ea70 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
1ea80 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1ea90 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1eaa0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1eab0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1eac0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1ead0 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
1eae0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
1eaf0 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
1eb00 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1eb10 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  KPT);..  PAGER_I
1eb20 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1eb30 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1eb40 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1eb50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1eb60 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1eb70 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1eb80 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52   pgno));.  PAGER
1eb90 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64  TRACE(("FETCH %d
1eba0 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1ebb0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1ebc0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1ebd0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
1ebe0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1ebf0 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1ec00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  c;.}../*.** Upda
1ec10 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
1ec20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1ec30 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34  er at offsets 24
1ec40 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68   and 92 in.** th
1ec50 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  e header and the
1ec60 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20   sqlite version 
1ec70 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
1ec80 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   96..**.** This 
1ec90 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  is an unconditio
1eca0 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65  nal update.  See
1ecb0 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f   also the pager_
1ecc0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1ecd0 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  er().** routine 
1ece0 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74  which only updat
1ecf0 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
1ed00 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64  unter if the upd
1ed10 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a  ate is actually.
1ed20 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65  ** needed, as de
1ed30 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
1ed40 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1ed50 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61  untDone state va
1ed60 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
1ed70 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69  c void pager_wri
1ed80 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1ed90 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1eda0 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1edb0 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  er;..  /* Increm
1edc0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1edd0 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1ede0 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1edf0 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1ee00 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
1ee10 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
1ee20 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  )pPg->pPager->db
1ee30 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70  FileVers)+1;.  p
1ee40 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1ee50 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c  )pPg->pData)+24,
1ee60 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1ee70 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f  ;..  /* Also sto
1ee80 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
1ee90 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
1eea0 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
1eeb0 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39   in.  ** bytes 9
1eec0 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20  2..95 store the 
1eed0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66  change counter f
1eee0 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72  or which the ver
1eef0 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  sion number.  **
1ef00 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
1ef10 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1ef20 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32  *)pPg->pData)+92
1ef30 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1ef40 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  );.  put32bits((
1ef50 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1ef60 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45  a)+96, SQLITE_VE
1ef70 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d  RSION_NUMBER);.}
1ef80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ef90 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
1efa0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1efb0 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f   invoked once fo
1efc0 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74  r each page that
1efd0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1efe0 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  n .** written in
1eff0 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  to the log file 
1f000 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73  when a WAL trans
1f010 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1f020 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65   back..** Parame
1f030 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70  ter iPg is the p
1f040 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  age number of sa
1f050 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74  id page. The pCt
1f060 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69  x argument .** i
1f070 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69  s actually a poi
1f080 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1f090 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  r structure..**.
1f0a0 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69  ** If page iPg i
1f0b0 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
1f0c0 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20   cache, and has 
1f0d0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
1f0e0 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74  eferences,.** it
1f0f0 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f   is discarded. O
1f100 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1f110 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
1f120 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  re outstanding.*
1f130 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68  * references, th
1f140 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
1f150 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20  s reloaded from 
1f160 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
1f170 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20   the.** attempt 
1f180 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e  to reload conten
1f190 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1f1a0 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ase is required 
1f1b0 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72  and fails, .** r
1f1c0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1f1d0 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
1f1e0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1f1f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f200 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1f210 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67  k(void *pCtx, Pg
1f220 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72  no iPg){.  int r
1f230 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1f240 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1f250 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a   (Pager *)pCtx;.
1f260 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1f270 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
1f280 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1f290 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
1f2a0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
1f2b0 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70  r, iPg);.  if( p
1f2c0 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Pg ){.    if( sq
1f2d0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
1f2e0 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20  efcount(pPg)==1 
1f2f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f300 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
1f310 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f320 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
1f330 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1f340 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
1f350 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1f360 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d  Pg->pgno, &iFram
1f370 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1f380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f390 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
1f3a0 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61  DbPage(pPg, iFra
1f3b0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1f3c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f3d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f3e0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1f3f0 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  r(pPg);.      }.
1f400 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f410 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
1f420 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
1f430 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69    /* Normally, i
1f440 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1f450 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
1f460 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65  any backup proce
1f470 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70  sses are.  ** up
1f480 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73  dated as data is
1f490 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74   copied out of t
1f4a0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1f4b0 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65  nal and into the
1f4c0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
1f4d0 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65  This is not gene
1f4e0 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77  rally possible w
1f4f0 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61  ith a WAL databa
1f500 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c  se, as.  ** roll
1f510 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69  back involves si
1f520 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20  mply truncating 
1f530 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68  the log file. Th
1f540 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a  erefore, if one.
1f550 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61    ** or more fra
1f560 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
1f570 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1f580 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68   the log (and th
1f590 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c  erefore .  ** al
1f5a0 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  so copied into t
1f5b0 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61  he backup databa
1f5c0 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20  ses) as part of 
1f5d0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1f5e0 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75  ,.  ** the backu
1f5f0 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61  ps must be resta
1f600 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rted..  */.  sql
1f610 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
1f620 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
1f630 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  p);..  return rc
1f640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f650 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f660 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ed to rollback a
1f670 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1f680 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a  a WAL database..
1f690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f6a0 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50  gerRollbackWal(P
1f6b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f6c0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6e0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1f6f0 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1f700 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1f710 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1f720 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72  dirty pages to r
1f730 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46  evert */..  /* F
1f740 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20  or all pages in 
1f750 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61  the cache that a
1f760 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  re currently dir
1f770 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61  ty or have alrea
1f780 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69  dy.  ** been wri
1f790 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f  tten (but not co
1f7a0 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20  mmitted) to the 
1f7b0 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65  log file, do one
1f7c0 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f   of the .  ** fo
1f7d0 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20  llowing:.  **.  
1f7e0 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74  **   + Discard t
1f7f0 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28  he cached page (
1f800 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c  if refcount==0),
1f810 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c   or.  **   + Rel
1f820 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
1f830 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1f840 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e  se (if refcount>
1f850 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  0)..  */.  pPage
1f860 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
1f870 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
1f880 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1f890 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  lUndo(pPager->pW
1f8a0 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  al, pagerUndoCal
1f8b0 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70  lback, (void *)p
1f8c0 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20  Pager);.  pList 
1f8d0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1f8e0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1f8f0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69  >pPCache);.  whi
1f900 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d  le( pList && rc=
1f910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f920 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d    PgHdr *pNext =
1f930 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1f940 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
1f950 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64  doCallback((void
1f960 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74   *)pPager, pList
1f970 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69  ->pgno);.    pLi
1f980 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a  st = pNext;.  }.
1f990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f9a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f9b0 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65  tion is a wrappe
1f9c0 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
1f9d0 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20  WalFrames(). As 
1f9e0 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a  well as logging.
1f9f0 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
1fa00 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70  of the list of p
1fa10 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20 70  ages headed by p
1fa20 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20  List (connected 
1fa30 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74  by pDirty),.** t
1fa40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74  his function not
1fa50 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76 65  ifies any active
1fa60 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1fa70 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 73  s that the pages
1fa80 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64   have.** changed
1fa90 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73  . .**.** The lis
1faa0 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73 65  t of pages passe
1fab0 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74  d into this rout
1fac0 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f  ine is always so
1fad0 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d  rted by page num
1fae0 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69  ber..** Hence, i
1faf0 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72 73  f page 1 appears
1fb00 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
1fb10 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62   list, it will b
1fb20 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1fb30 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74  ..*/ .static int
1fb40 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
1fb50 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1fb60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fb70 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
1fb80 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ct */.  PgHdr *p
1fb90 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
1fba0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1fbb0 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67  of frames to log
1fbc0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e   */.  Pgno nTrun
1fbd0 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
1fbe0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1fbf0 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69  e size after thi
1fc00 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e  s commit */.  in
1fc10 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fc30 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1fc40 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a   a commit */.){.
1fc50 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc70 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1fc80 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b   */.  int nList;
1fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fca0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1fcb0 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73  of pages in pLis
1fcc0 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 3b  t */.  PgHdr *p;
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fce0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1fcf0 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73  oping over pages
1fd00 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1fd10 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20  Pager->pWal );. 
1fd20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29   assert( pList )
1fd30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1fd40 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66  DEBUG.  /* Verif
1fd50 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
1fd60 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e  list is in accen
1fd70 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
1fd80 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26  for(p=pList; p &
1fd90 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70  & p->pDirty; p=p
1fda0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61  ->pDirty){.    a
1fdb0 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c  ssert( p->pgno <
1fdc0 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f   p->pDirty->pgno
1fdd0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
1fde0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
1fdf0 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73  >pDirty==0 || is
1fe00 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20  Commit );.  if( 
1fe10 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
1fe20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e  /* If a WAL tran
1fe30 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
1fe40 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72   committed, ther
1fe50 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
1fe60 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20   writing.    ** 
1fe70 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70  any pages with p
1fe80 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
1fe90 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61  ter than nTrunca
1fea0 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20  te into the WAL 
1feb0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  file..    ** The
1fec0 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
1fed0 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65  read by any clie
1fee0 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68  nt. So remove th
1fef0 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72  em from the pDir
1ff00 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68  ty.    ** list h
1ff10 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64  ere. */.    PgHd
1ff20 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c  r **ppNext = &pL
1ff30 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  ist;.    nList =
1ff40 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   0;.    for(p=pL
1ff50 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20  ist; (*ppNext = 
1ff60 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72  p)!=0; p=p->pDir
1ff70 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ty){.      if( p
1ff80 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74  ->pgno<=nTruncat
1ff90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e  e ){.        ppN
1ffa0 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79  ext = &p->pDirty
1ffb0 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b  ;.        nList+
1ffc0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1ffd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
1ffe0 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
1fff0 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20     nList = 1;.  
20000 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61  }.  pPager->aSta
20010 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
20020 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20  TE] += nList;.. 
20030 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
20040 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
20050 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
20060 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73  pList);.  rc = s
20070 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
20080 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20  pPager->pWal, . 
20090 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
200a0 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54  eSize, pList, nT
200b0 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69  runcate, isCommi
200c0 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t, pPager->walSy
200d0 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69  ncFlags.  );.  i
200e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
200f0 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63   && pPager->pBac
20100 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  kup ){.    for(p
20110 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
20120 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73  pDirty){.      s
20130 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
20140 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
20150 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38  up, p->pgno, (u8
20160 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20   *)p->pData);.  
20170 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
20180 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
20190 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  ES.  pList = sql
201a0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
201b0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
201c0 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c  che);.  for(p=pL
201d0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
201e0 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  rty){.    pager_
201f0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b  set_pagehash(p);
20200 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
20210 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20220 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20  ** Begin a read 
20230 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
20240 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  he WAL..**.** Th
20250 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  is routine used 
20260 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61  to be called "pa
20270 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28  gerOpenSnapshot(
20280 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73  )" because it es
20290 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b  sentially.** mak
202a0 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66  es a snapshot of
202b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
202c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69   the current poi
202d0 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70  nt in time and p
202e0 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74  reserves.** that
202f0 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73   snapshot for us
20300 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20  e by the reader 
20310 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63  in spite of conc
20320 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73  urrently changes
20330 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69   by.** other wri
20340 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69  ters or checkpoi
20350 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nters..*/.static
20360 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52   int pagerBeginR
20370 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  eadTransaction(P
20380 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20390 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
203c0 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64  */.  int changed
203d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
203e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
203f0 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65  cache must be re
20400 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
20410 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
20420 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
20430 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20440 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
20450 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
20460 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
20470 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61  ..  /* sqlite3Wa
20480 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
20490 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ion() was not ca
204a0 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65  lled for the pre
204b0 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73  vious.  ** trans
204c0 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e  action in lockin
204d0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
204e0 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f  .  So call it no
204f0 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61  w.  If we.  ** a
20500 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  re in locking_mo
20510 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e  de=NORMAL and En
20520 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76  dRead() was prev
20530 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20  iously called,. 
20540 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74   ** the duplicat
20550 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65  e call is harmle
20560 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
20570 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
20580 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
20590 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73  pWal);..  rc = s
205a0 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65  qlite3WalBeginRe
205b0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
205c0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61  ager->pWal, &cha
205d0 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21  nged);.  if( rc!
205e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68  =SQLITE_OK || ch
205f0 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67  anged ){.    pag
20600 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
20610 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  ;.    if( USEFET
20620 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
20630 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
20640 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
20650 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
20660 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
20670 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20680 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
20690 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  rt of the transi
206a0 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f  tion from PAGER_
206b0 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52  OPEN.** to PAGER
206c0 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f  _READER state to
206d0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
206e0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
206f0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70  ase file.** in p
20700 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74  ages (assuming t
20710 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72  he page size cur
20720 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
20730 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29   Pager.pageSize)
20740 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
20750 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
20760 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20770 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  d and the size o
20780 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
20790 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74  * in pages is st
207a0 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e  ored in *pnPage.
207b0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
207c0 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61  rror code (perha
207d0 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  ps.** SQLITE_IOE
207e0 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74  RR_FSTAT) is ret
207f0 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
20800 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  e is left unmodi
20810 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
20820 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75  int pagerPagecou
20830 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
20840 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b  , Pgno *pnPage){
20850 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20  .  Pgno nPage;  
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
20880 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
20890 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79  e */..  /* Query
208a0 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
208b0 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61  tem for the data
208c0 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57  base size. The W
208d0 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20  alDbsize().  ** 
208e0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
208f0 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c   zero if the WAL
20900 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e   is not open (i.
20910 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30  e. Pager.pWal==0
20920 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68  ), or.  ** if th
20930 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
20940 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
20950 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
20960 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ize is not.  ** 
20970 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
20980 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
20990 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c  m if the log fil
209a0 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20  e is empty or.  
209b0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76  ** contains no v
209c0 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74  alid committed t
209d0 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  ransactions..  *
209e0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
209f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
20a00 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
20a10 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
20a20 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
20a30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
20a40 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
20a50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20a60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
20a70 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c  );.  nPage = sql
20a80 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
20a90 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
20aa0 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  /* If the number
20ab0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
20ac0 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
20ad0 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
20ae0 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62  the.  ** WAL sub
20af0 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d 69  -system, determi
20b00 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e  ne the page coun
20b10 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
20b20 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ize of.  ** the 
20b30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
20b40 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  If the size of t
20b50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20b60 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20   is not an.  ** 
20b70 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
20b80 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
20b90 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68 65 20  e, round up the 
20ba0 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
20bb0 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 41  f( nPage==0 && A
20bc0 4c 57 41 59 53 28 69 73 4f 70 65 6e 28 70 50 61  LWAYS(isOpen(pPa
20bd0 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20  ger->fd)) ){.   
20be0 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c00 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * Size of db fil
20c10 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
20c20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
20c30 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
20c40 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
20c50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
20c70 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
20c80 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29    nPage = (Pgno)
20c90 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  ((n+pPager->page
20ca0 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72  Size-1) / pPager
20cb0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
20cc0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
20cd0 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
20ce0 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
20cf0 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
20d00 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  n the.  ** confi
20d10 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61  gured maximum pa
20d20 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72  ger number, incr
20d30 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64  ease the allowed
20d40 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74   limit so.  ** t
20d50 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hat the file can
20d60 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20   be read..  */. 
20d70 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65   if( nPage>pPage
20d80 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
20d90 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
20da0 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20  = (Pgno)nPage;. 
20db0 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   }..  *pnPage = 
20dc0 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
20dd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
20de0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20df0 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63  T_WAL./*.** Chec
20e00 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  k if the *-wal f
20e10 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70  ile that corresp
20e20 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61  onds to the data
20e30 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
20e40 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20  Pager.** exists 
20e50 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
20e60 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20  is not empy, or 
20e70 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
20e80 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  *-wal file does.
20e90 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79  ** not exist (by
20ea0 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66   deleting it) if
20eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20ec0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
20ed0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
20ee0 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20  se is not empty 
20ef0 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  and the *-wal fi
20f00 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20  le exists, open 
20f10 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20  the pager.** in 
20f20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68  WAL mode.  If th
20f30 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
20f40 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77  pty or if no *-w
20f50 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
20f60 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f  nd.** if no erro
20f70 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73  r occurs, make s
20f80 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ure Pager.journa
20f90 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74  lMode is not set
20fa0 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55   to.** PAGER_JOU
20fb0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a  RNALMODE_WAL..**
20fc0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
20fd0 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72  E_OK or an error
20fe0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
20ff0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c   caller must hol
21000 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  d a SHARED lock 
21010 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21020 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  file to call thi
21030 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42  s.** function. B
21040 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53  ecause an EXCLUS
21050 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
21060 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  db file is requi
21070 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a  red to delete .*
21080 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e  * a WAL on a non
21090 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  e-empty database
210a0 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
210b0 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20  here is no race 
210c0 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65  condition .** be
210d0 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73  tween the xAcces
210e0 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e  s() below and an
210f0 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67   xDelete() being
21100 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d   executed by som
21110 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e  e .** other conn
21120 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
21130 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57  c int pagerOpenW
21140 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65  alIfPresent(Page
21150 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
21160 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
21180 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
21190 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
211a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
211b0 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
211c0 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
211d0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
211e0 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20    int isWal;    
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21200 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66  /* True if WAL f
21210 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
21220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21230 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
21240 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
21250 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49  ager->zWal, SQLI
21260 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
21270 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 29 3b 0a  , &isWal.    );.
21280 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
212a0 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20  f( isWal ){.    
212b0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
212e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
212f0 2f 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  /..        rc = 
21300 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
21310 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
21320 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
21330 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21340 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
21350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
21360 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
21370 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
21380 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30   pPager->zWal, 0
21390 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
213a0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
213b0 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61  case( sqlite3Pca
213c0 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
213d0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
213e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
213f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
21400 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30  penWal(pPager, 0
21410 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21420 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
21430 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
21440 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
21450 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
21460 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21470 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
21480 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
21490 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
214a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
214b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
214c0 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
214d0 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
214e0 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
214f0 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
21500 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
21510 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
21520 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
21530 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
21540 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
21550 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
21560 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
21570 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
21580 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
21590 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
215a0 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
215b0 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
215c0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
215d0 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
215e0 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
215f0 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
21600 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
21610 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
21620 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
21630 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
21640 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
21650 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
21660 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
21670 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
21680 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
21690 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
216a0 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
216b0 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
216c0 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
216d0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
216e0 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
216f0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
21700 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
21710 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
21720 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
21730 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
21740 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
21750 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
21760 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
21770 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
21780 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
21790 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
217a0 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
217b0 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
217c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
217d0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
217e0 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
217f0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
21800 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
21810 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
21820 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
21830 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
21840 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
21850 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
21860 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
21870 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
21880 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
21890 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
218a0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
218b0 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
218c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
218d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
218e0 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
218f0 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
21900 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
21910 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
21920 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
21930 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
21940 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
21950 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
21960 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
21970 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
21980 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
21990 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
219a0 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
219b0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
219c0 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
219d0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
219e0 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
219f0 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
21a00 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
21a10 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
21a20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
21a30 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
21a40 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
21a50 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
21a60 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
21a70 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
21a80 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
21a90 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
21aa0 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
21ab0 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
21ac0 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
21ad0 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
21ae0 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
21af0 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
21b00 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
21b10 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
21b20 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
21b30 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
21b40 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
21b50 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
21b60 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
21b70 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
21b80 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
21b90 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
21ba0 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
21bb0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
21bc0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
21bd0 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
21be0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
21bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
21c00 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
21c10 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
21c20 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c40 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
21c50 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
21c60 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
21c70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21c80 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
21c90 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
21ca0 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
21cb0 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
21cc0 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
21cd0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
21ce0 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
21cf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
21d00 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
21d10 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
21d20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
21d30 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
21d40 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ED );..  /* Allo
21d50 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f  cate a bitvec to
21d60 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68   use to store th
21d70 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72  e set of pages r
21d80 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  olled back */.  
21d90 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
21da0 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71  {.    pDone = sq
21db0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
21dc0 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  e(pSavepoint->nO
21dd0 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rig);.    if( !p
21de0 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Done ){.      re
21df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
21e00 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
21e10 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
21e20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
21e30 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
21e40 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
21e50 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
21e60 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
21e70 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
21e80 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
21e90 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
21ea0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
21eb0 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
21ec0 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67  OrigSize;.  pPag
21ed0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
21ee0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
21ef0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21  mpFile;..  if( !
21f00 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61  pSavepoint && pa
21f10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
21f20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
21f30 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
21f40 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
21f50 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
21f60 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
21f70 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
21f80 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
21f90 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
21fa0 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
21fb0 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
21fc0 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
21fd0 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
21fe0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
21ff0 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
22000 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
22010 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
22020 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
22030 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
22040 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
22050 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
22060 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
22070 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
22080 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
22090 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a  0 || szJ==0 );..
220a0 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
220b0 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
220c0 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
220d0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
220e0 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
220f0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
22100 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
22110 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
22120 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
22130 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
22140 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
22150 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
22160 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
22170 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
22180 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
22190 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
221a0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
221b0 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
221c0 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
221d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
221e0 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
221f0 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
22200 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
22210 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
22220 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ( pSavepoint && 
22230 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
22240 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72  ger) ){.    iHdr
22250 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
22260 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
22270 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
22280 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
22290 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
222a0 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
222b0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
222c0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
222d0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
222e0 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
222f0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
22300 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
22310 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
22320 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
22330 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
22340 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
22350 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
22360 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
22370 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
22380 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
22390 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
223a0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
223b0 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
223c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
223d0 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
223e0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
223f0 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
22400 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
22410 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
22420 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
22430 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
22440 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
22450 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
22460 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
22470 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
22480 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
22490 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
224a0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
224b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
224c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
224d0 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
224e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
224f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
22500 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
22510 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
22520 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
22530 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
22540 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
22550 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
22560 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
22570 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
22580 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
22590 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
225a0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
225b0 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
225c0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
225d0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
225e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
225f0 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
22600 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
22610 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
22620 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
22630 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
22640 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
22650 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
22660 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
22670 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
22680 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
22690 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
226a0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
226b0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
226c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
226d0 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
226e0 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
226f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22700 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
22710 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
22720 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
22730 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22740 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
22750 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22760 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
22770 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
22780 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
22790 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
227a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
227b0 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
227c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
227d0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
227e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
227f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
22800 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22810 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f>=szJ );..  /* 
22820 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
22830 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
22840 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
22850 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
22860 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
22870 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
22880 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
22890 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
228a0 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
228b0 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
228c0 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
228d0 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
228e0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
228f0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
22900 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
22910 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
22920 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
22930 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34  64 offset = (i64
22940 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  )pSavepoint->iSu
22950 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
22960 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
22970 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
22980 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
22990 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
229a0 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50  SavepointUndo(pP
229b0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76  ager->pWal, pSav
229c0 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61  epoint->aWalData
229d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
229e0 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e  (ii=pSavepoint->
229f0 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c  iSubRec; rc==SQL
22a00 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61  ITE_OK && ii<pPa
22a10 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69  ger->nSubRec; ii
22a20 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
22a30 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29  t( offset==(i64)
22a40 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
22a50 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
22a60 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
22a70 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
22a80 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
22a90 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
22aa0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
22ab0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
22ac0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
22ad0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
22ae0 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
22af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22b00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22b10 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
22b20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22b30 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
22b40 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
22b50 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
22b60 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
22b70 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74  wed.** before at
22b80 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63 79  tempting to recy
22b90 63 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e  cle clean and un
22ba0 75 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76  used pages..*/.v
22bb0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
22bc0 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
22bd0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
22be0 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
22bf0 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
22c00 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
22c10 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
22c20 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
22c30 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
22c40 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
22c50 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
22c60 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  lowed.** before 
22c70 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70  attempting to sp
22c80 69 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f 75  ill pages to jou
22c90 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
22ca0 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c  ite3PagerSetSpil
22cb0 6c 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  lsize(Pager *pPa
22cc0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
22cd0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
22ce0 65 33 50 63 61 63 68 65 53 65 74 53 70 69 6c 6c  e3PcacheSetSpill
22cf0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
22d00 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
22d10 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53  ../*.** Invoke S
22d20 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
22d30 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74  _SIZE based on t
22d40 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
22d50 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73   of szMmap..*/.s
22d60 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
22d70 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65  FixMaplimit(Page
22d80 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20  r *pPager){.#if 
22d90 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
22da0 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33  SIZE>0.  sqlite3
22db0 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
22dc0 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73  er->fd;.  if( is
22dd0 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e  Open(fd) && fd->
22de0 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69  pMethods->iVersi
22df0 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c  on>=3 ){.    sql
22e00 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20  ite3_int64 sz;. 
22e10 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e     sz = pPager->
22e20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67  szMmap;.    pPag
22e30 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20  er->bUseFetch = 
22e40 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 65 74 47  (sz>0);.    setG
22e50 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67  etterMethod(pPag
22e60 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
22e70 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
22e80 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
22e90 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
22ea0 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a  SIZE, &sz);.  }.
22eb0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
22ec0 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
22ed0 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d  um size of any m
22ee0 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61  emory mapping ma
22ef0 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
22f00 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  se file..*/.void
22f10 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22f20 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20  MmapLimit(Pager 
22f30 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33  *pPager, sqlite3
22f40 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
22f50 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70    pPager->szMmap
22f60 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67   = szMmap;.  pag
22f70 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
22f80 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
22f90 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  Free as much mem
22fa0 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
22fb0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a  from the pager..
22fc0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
22fd0 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72  agerShrink(Pager
22fe0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
22ff0 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b  ite3PcacheShrink
23000 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
23010 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
23020 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74  st settings of t
23030 68 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73  he pager to thos
23040 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  e specified in t
23050 68 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d  he pgFlags param
23060 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
23070 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61  "level" in pgFla
23080 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  gs & PAGER_SYNCH
23090 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73  RONOUS_MASK sets
230a0 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a   the robustness.
230b0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
230c0 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
230d0 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f   to OS crashes o
230e0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
230f0 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20   by.** changing 
23100 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
23110 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
23120 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73  ing the journals
23130 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66  ..** There are f
23140 6f 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  our levels:.**.*
23150 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
23160 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
23170 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
23180 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
23190 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
231a0 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
231b0 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
231c0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
231d0 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
231e0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
231f0 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
23200 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
23210 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23220 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
23230 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
23240 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
23250 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
23260 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
23270 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
23280 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
23290 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
232a0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
232b0 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
232c0 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
232d0 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
232e0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
232f0 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
23300 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
23310 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
23320 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
23330 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
23340 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
23350 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
23360 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
23370 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
23380 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
23390 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
233a0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
233b0 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
233c0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
233d0 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
233e0 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
233f0 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
23400 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
23410 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
23420 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
23440 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
23450 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
23460 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
23470 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
23480 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
23490 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
234a0 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
234b0 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
234c0 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
234d0 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
234e0 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
234f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23500 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
23510 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
23520 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
23530 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
23540 20 20 20 45 58 54 52 41 20 20 20 20 20 54 68 69     EXTRA     Thi
23550 73 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65  s is like FULL e
23560 78 63 65 70 74 20 74 68 61 74 20 69 73 20 61 6c  xcept that is al
23570 73 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69 72  so syncs the dir
23580 65 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20  ectory.**       
23590 20 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74         that cont
235a0 61 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63  ains the rollbac
235b0 6b 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20  k journal after 
235c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
235e0 72 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64  rnal is unlinked
235f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  ..**.** The abov
23600 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62  e is for a rollb
23610 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ack-journal mode
23620 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c  .  For WAL mode,
23630 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a   OFF continues.*
23640 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e  * to mean that n
23650 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63  o syncs ever occ
23660 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e  ur.  NORMAL mean
23670 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69  s that the WAL i
23680 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f  s synced.** prio
23690 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
236a0 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64  f checkpoint and
236b0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
236c0 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  se file is synce
236d0 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  d.** at the conc
236e0 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  lusion of the ch
236f0 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
23700 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
23710 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73  f the WAL.** was
23720 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
23730 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
23740 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70    But no sync op
23750 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66  erations occur f
23760 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  or.** an ordinar
23770 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d  y commit in NORM
23780 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c  AL mode with WAL
23790 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68  .  FULL means th
237a0 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69  at the WAL.** fi
237b0 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c  le is synced fol
237c0 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d  lowing each comm
237d0 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e  it operation, in
237e0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
237f0 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69  .** syncs associ
23800 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c  ated with NORMAL
23810 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64  .  There is no d
23820 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
23830 6e 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58  n FULL.** and EX
23840 54 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65  TRA for WAL mode
23850 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63  ..**.** Do not c
23860 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f  onfuse synchrono
23870 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c  us=FULL with SQL
23880 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20  ITE_SYNC_FULL.  
23890 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59  The.** SQLITE_SY
238a0 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65  NC_FULL macro me
238b0 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d  ans to use the M
238c0 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c  acOSX-style full
238d0 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20  -fsync.** using 
238e0 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e  fcntl(F_FULLFSYN
238f0 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43  C).  SQLITE_SYNC
23900 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f  _NORMAL means to
23910 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61   do an.** ordina
23920 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ry fsync() call.
23930 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
23940 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
23950 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
23960 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  L.** and SQLITE_
23970 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70  SYNC_NORMAL on p
23980 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74  latforms other t
23990 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74  han MacOSX.  But
239a0 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e   the.** synchron
239b0 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20  ous=FULL versus 
239c0 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
239d0 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72  AL setting deter
239e0 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68  mines when.** th
239f0 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76  e xSync primitiv
23a00 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20  e is called and 
23a10 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61  is relevant to a
23a20 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a  ll platforms..**
23a30 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
23a40 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
23a50 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
23a60 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
23a70 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
23a80 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
23a90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
23aa0 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
23ab0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
23ac0 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ags(.  Pager *pP
23ad0 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
23ae0 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74  The pager to set
23af0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f   safety level fo
23b00 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
23b10 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20  pgFlags      /* 
23b20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f  Various flags */
23b30 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  .){.  unsigned l
23b40 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26  evel = pgFlags &
23b50 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
23b60 55 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70  US_MASK;.  if( p
23b70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
23b80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
23b90 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  oSync = 1;.    p
23ba0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
23bb0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
23bc0 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a  >extraSync = 0;.
23bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
23be0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c  ger->noSync =  l
23bf0 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43  evel==PAGER_SYNC
23c00 48 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30  HRONOUS_OFF ?1:0
23c10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  ;.    pPager->fu
23c20 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d  llSync = level>=
23c30 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
23c40 53 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20  S_FULL ?1:0;.   
23c50 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
23c60 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45  nc = level==PAGE
23c70 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58  R_SYNCHRONOUS_EX
23c80 54 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  TRA ?1:0;.  }.  
23c90 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
23ca0 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
23cb0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b  ->syncFlags = 0;
23cc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
23cd0 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  tSyncFlags = 0;.
23ce0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
23cf0 61 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c  ags & PAGER_FULL
23d00 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61  FSYNC ){.    pPa
23d10 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
23d20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
23d30 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
23d40 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
23d50 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
23d60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46  .  }else if( pgF
23d70 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50  lags & PAGER_CKP
23d80 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  T_FULLFSYNC ){. 
23d90 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
23da0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
23db0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
23dc0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
23dd0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
23de0 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
23df0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
23e00 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23e10 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
23e20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
23e30 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23e40 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
23e50 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  }.  pPager->walS
23e60 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65  yncFlags = pPage
23e70 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20  r->syncFlags;.  
23e80 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
23e90 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
23ea0 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
23eb0 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41   |= WAL_SYNC_TRA
23ec0 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20  NSACTIONS;.  }. 
23ed0 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
23ee0 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20  AGER_CACHESPILL 
23ef0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
23f00 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
23f10 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d  ILLFLAG_OFF;.  }
23f20 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
23f30 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
23f40 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20  SPILLFLAG_OFF;. 
23f50 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
23f60 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23f70 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
23f80 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
23f90 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
23fa0 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
23fb0 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
23fc0 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
23fd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
23fe0 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
23ff0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
24000 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
24010 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
24020 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
24030 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
24040 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
24050 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
24060 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
24070 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
24080 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
24090 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
240a0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
240b0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
240c0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
240d0 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
240e0 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
240f0 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
24100 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
24110 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
24120 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
24130 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
24140 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
24150 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
24160 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
24170 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
24180 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
24190 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
241a0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
241b0 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
241c0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
241d0 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
241e0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
241f0 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
24200 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
24210 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
24220 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
24230 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
24240 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
24250 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
24260 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
24270 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
24280 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
24290 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
242a0 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
242b0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
242c0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
242d0 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
242e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
242f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
24300 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
24310 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
24320 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
24330 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
24340 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
24350 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
24360 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
24370 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
24380 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
24390 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
243a0 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
243b0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
243c0 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
243d0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
243e0 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
243f0 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
24400 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
24410 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
24420 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
24430 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
24440 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65  n(pFile) );.  re
24450 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24460 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
24470 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
24480 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
24490 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73   invokes the bus
244a0 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c  y-handler if sql
244b0 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74  ite3OsLock() ret
244c0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
244d0 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67  BUSY when trying
244e0 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
244f0 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48   no-lock to a SH
24500 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72  ARED lock,.** or
24510 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
24520 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
24530 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
24540 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a  an EXCLUSIVE .**
24550 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a   lock. It does *
24560 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  not* invoke the 
24570 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
24580 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
24590 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45  .** SHARED to RE
245a0 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20  SERVED, or when 
245b0 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53  upgrading from S
245c0 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49  HARED to EXCLUSI
245d0 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63  VE.** (which occ
245e0 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  urs during hot-j
245f0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
24600 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a  . Summary:.**.**
24610 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20     Transition   
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24630 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78       | Invokes x
24640 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20  BusyHandler.**  
24650 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
24660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24680 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e  ---------.**   N
24690 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20  O_LOCK       -> 
246a0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
246b0 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52   | Yes.**   SHAR
246c0 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53  ED_LOCK   -> RES
246d0 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20  ERVED_LOCK    | 
246e0 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  No.**   SHARED_L
246f0 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49  OCK   -> EXCLUSI
24700 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a  VE_LOCK   | No.*
24710 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  *   RESERVED_LOC
24720 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c  K -> EXCLUSIVE_L
24730 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a  OCK   | Yes.**.*
24740 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61  * If the busy-ha
24750 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72  ndler callback r
24760 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
24770 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   the lock is .**
24780 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20   retried. If it 
24790 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68  returns zero, th
247a0 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  en the SQLITE_BU
247b0 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72  SY error is.** r
247c0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
247d0 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67  aller of the pag
247e0 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
247f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24800 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
24810 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
24820 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
24830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
24840 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
24850 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
24860 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20  ler)(void *),   
24870 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
24880 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
24890 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
248a0 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
248b0 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  rArg            
248c0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
248d0 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
248e0 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20  Handler */.){.  
248f0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
24900 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
24910 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
24920 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
24930 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
24940 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  ;..  if( isOpen(
24950 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
24960 20 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28     void **ap = (
24970 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d  void **)&pPager-
24980 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20  >xBusyHandler;. 
24990 20 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74     assert( ((int
249a0 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b  (*)(void *))(ap[
249b0 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c  0]))==xBusyHandl
249c0 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  er );.    assert
249d0 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61  ( ap[1]==pBusyHa
249e0 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20  ndlerArg );.    
249f0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
24a00 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
24a10 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
24a20 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28  L_BUSYHANDLER, (
24a30 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a  void *)ap);.  }.
24a40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
24a50 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73  the page size us
24a60 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20  ed by the Pager 
24a70 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20  object. The new 
24a80 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73  page size .** is
24a90 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67   passed in *pPag
24aa0 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
24ab0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
24ac0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
24ad0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
24ae0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
24af0 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
24b00 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
24b10 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20  ed is the error 
24b20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
24b30 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f   (i.e. .** one o
24b40 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  f SQLITE_IOERR, 
24b50 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
24b60 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20  xxx sub-code or 
24b70 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a  SQLITE_FULL)..**
24b80 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
24b90 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
24ba0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
24bb0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e  .**.**   * the n
24bc0 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61  ew page size (va
24bd0 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a  lue of *pPageSiz
24be0 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70  e) is valid (a p
24bf0 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20  ower .**     of 
24c00 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20  two between 512 
24c10 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  and SQLITE_MAX_P
24c20 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73  AGE_SIZE, inclus
24c30 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ive), and.**.** 
24c40 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f    * there are no
24c50 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
24c60 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e  e references, an
24c70 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  d.**.**   * the 
24c80 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68  database is eith
24c90 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  er not an in-mem
24ca0 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20  ory database or 
24cb0 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20  it is.**     an 
24cc0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
24cd0 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  se that currentl
24ce0 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  y consists of ze
24cf0 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ro pages..**.** 
24d00 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f  then the pager o
24d10 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20  bject page size 
24d20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65  is set to *pPage
24d30 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
24d40 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
24d50 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68  changed, then th
24d60 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  is function uses
24d70 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c   sqlite3PagerMal
24d80 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74  loc() .** to obt
24d90 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e  ain a new Pager.
24da0 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
24db0 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61  . If this alloca
24dc0 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a  tion attempt .**
24dd0 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
24de0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
24df0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69   and the page si
24e00 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61  ze remains uncha
24e10 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c  nged. .** In all
24e20 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51   other cases, SQ
24e30 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
24e40 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
24e50 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
24e60 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68  ot changed, eith
24e70 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  er because one o
24e80 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64  f the enumerated
24e90 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
24ea0 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65  bove is not true
24eb0 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  , the pager was 
24ec0 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
24ed0 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hen this.** func
24ee0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c  tion was called,
24ef0 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
24f00 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
24f10 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64  n attempt failed
24f20 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67  , .** then *pPag
24f30 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  eSize is set to 
24f40 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65  the old, retaine
24f50 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f  d page size befo
24f60 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
24f70 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24f80 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
24f90 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20  er *pPager, u32 
24fa0 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  *pPageSize, int 
24fb0 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74  nReserve){.  int
24fc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24fd0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74  ..  /* It is not
24fe0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20   possible to do 
24ff0 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61  a full assert_pa
25000 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65  ger_state() here
25010 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  , as this.  ** f
25020 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
25030 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
25040 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62  n PagerOpen(), b
25050 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a  efore the state.
25060 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65    ** of the Page
25070 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65  r object is inte
25080 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e  rnally consisten
25090 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20  t..  **.  ** At 
250a0 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66  one point this f
250b0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64  unction returned
250c0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
250d0 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20   pager was in . 
250e0 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
250f0 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65  state. But since
25100 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
25110 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  te guarantees th
25120 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  at.  ** there is
25130 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
25140 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
25150 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66  eference, this f
25160 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
25170 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74  a no-op for that
25180 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20   case anyhow..  
25190 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69  */..  u32 pageSi
251a0 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
251b0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53  .  assert( pageS
251c0 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53  ize==0 || (pageS
251d0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
251e0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
251f0 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20  _PAGE_SIZE) );. 
25200 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65   if( (pPager->me
25210 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
25220 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
25230 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
25240 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
25250 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20  >pPCache)==0 .  
25260 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20   && pageSize && 
25270 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70  pageSize!=(u32)p
25280 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
25290 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
252a0 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  pNew = NULL;    
252b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
252c0 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20  temp space */.  
252d0 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b    i64 nByte = 0;
252e0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
252f0 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f  ->eState>PAGER_O
25300 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50  PEN && isOpen(pP
25310 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
25320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
25330 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
25340 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  ->fd, &nByte);. 
25350 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
25360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25370 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72      pNew = (char
25380 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61   *)sqlite3PageMa
25390 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
253a0 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20        if( !pNew 
253b0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
253c0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
253d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
253e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
253f0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
25400 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
25410 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
25420 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
25430 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
25440 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
25450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25470 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
25480 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
25490 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
254a0 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
254b0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
254c0 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79  ze = (Pgno)((nBy
254d0 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70  te+pageSize-1)/p
254e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
254f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
25500 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
25510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
25520 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e  lite3PageFree(pN
25530 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ew);.    }.  }..
25540 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
25550 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
25560 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
25570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
25580 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
25590 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
255a0 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
255b0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
255c0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
255d0 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
255e0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
255f0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
25600 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
25610 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67  pPager);.    pag
25620 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
25630 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
25640 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25650 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
25660 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
25670 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
25680 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
25690 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
256a0 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
256b0 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
256c0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
256d0 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
256e0 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
256f0 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
25700 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
25710 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
25720 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
25730 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
25740 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
25750 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
25760 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
25770 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
25780 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
25790 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
257a0 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
257b0 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
257c0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
257d0 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
257e0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
257f0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
25800 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
25810 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
25820 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
25830 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
25840 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
25850 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
25860 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
25870 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
25880 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
25890 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
258a0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
258b0 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
258c0 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
258d0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
258e0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
258f0 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
25900 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
25910 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
25920 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
25930 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
25940 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
25950 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
25960 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
25970 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
25980 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73  xPage;.  }.  ass
25990 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
259a0 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
259b0 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65  );      /* Calle
259c0 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78  d only by OP_Max
259d0 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72  Pgcnt */.  asser
259e0 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  t( pPager->mxPgn
259f0 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o>=pPager->dbSiz
25a00 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50  e );  /* OP_MaxP
25a10 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68  gcnt enforces th
25a20 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  is */.  return p
25a30 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
25a40 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
25a50 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
25a60 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
25a70 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
25a80 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
25a90 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
25aa0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
25ab0 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
25ac0 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
25ad0 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
25ae0 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
25af0 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
25b00 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
25b10 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
25b20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
25b30 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
25b40 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
25b50 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
25b60 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
25b70 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
25b80 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
25b90 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
25ba0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
25bb0 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
25bc0 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
25bd0 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
25be0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
25bf0 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
25c00 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
25c10 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
25c20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
25c30 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
25c40 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
25c50 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25c60 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
25c70 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
25c80 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
25c90 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
25ca0 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
25cb0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
25cc0 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
25cd0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
25ce0 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
25cf0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
25d00 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
25d10 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
25d20 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
25d30 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
25d40 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
25d50 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
25d60 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
25d70 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
25d80 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
25d90 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
25da0 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
25db0 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
25dc0 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
25dd0 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
25de0 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
25df0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
25e00 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
25e10 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
25e20 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
25e30 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
25e40 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
25e50 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
25e60 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
25e70 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
25e80 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
25e90 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
25ea0 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
25eb0 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
25ec0 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
25ed0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
25ee0 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
25ef0 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
25f00 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
25f10 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
25f20 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
25f30 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
25f40 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
25f50 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
25f60 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
25f70 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
25f80 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
25f90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
25fa0 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
25fb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
25fc0 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
25fd0 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
25fe0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
25ff0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
26000 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  File );..  /* Th
26010 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
26020 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72  ly called by btr
26030 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ee immediately a
26040 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20  fter creating.  
26050 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  ** the Pager obj
26060 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20  ect.  There has 
26070 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f  not been an oppo
26080 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73  rtunity to trans
26090 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41  ition.  ** to WA
260a0 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f  L mode yet..  */
260b0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
260c0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
260d0 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  );..  if( isOpen
260e0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
260f0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
26100 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
26110 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
26120 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
26130 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
26140 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
26150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26160 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
26170 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
26180 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
26190 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
261a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
261b0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
261c0 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
261d0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
261e0 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  on is open on.**
261f0 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72   the pager. It r
26200 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
26210 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
26220 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
26230 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ..**.** However,
26240 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
26250 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
26260 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
26270 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
26280 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
26290 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
262a0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
262b0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
262c0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
262d0 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
262e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
262f0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
26300 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
26310 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
26320 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
26330 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70  FINISHED );.  *p
26340 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61  nPage = (int)pPa
26350 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a  ger->dbSize;.}..
26360 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
26370 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
26380 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
26390 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
263a0 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
263b0 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
263c0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
263d0 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
263e0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
263f0 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
26400 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
26410 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
26420 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
26430 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
26440 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
26450 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
26460 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
26470 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
26480 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
26490 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
264a0 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
264b0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
264c0 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
264d0 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
264e0 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
264f0 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
26500 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
26510 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
26520 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
26530 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
26540 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
26550 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
26560 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
26570 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
26580 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
26590 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
265a0 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
265b0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
265c0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
265d0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
265e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
265f0 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
26600 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
26610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26620 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
26630 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
26640 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
26650 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
26660 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
26670 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
26680 20 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20   already held), 
26690 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72  or one of the tr
266a0 61 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74  ansitions that t
266b0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
266c0 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
266d0 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
266e0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
266f0 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
26700 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
26710 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
26720 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
26730 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63  ager->eLock>=loc
26740 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
26750 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
26760 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  =NO_LOCK && lock
26770 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
26780 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  K).       || (pP
26790 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53  ager->eLock==RES
267a0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f  ERVED_LOCK && lo
267b0 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
267c0 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20  E_LOCK).  );..  
267d0 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  do {.    rc = pa
267e0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
267f0 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d  , locktype);.  }
26800 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
26810 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72  E_BUSY && pPager
26820 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70  ->xBusyHandler(p
26830 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
26840 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74  lerArg) );.  ret
26850 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26860 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74   Function assert
26870 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26880 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b  nt(pPager) check
26890 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
268a0 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
268b0 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20  is true for all 
268c0 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72  dirty pages curr
268d0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
268e0 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20  e-cache:.**.**  
268f0 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d   a) The page num
26900 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
26910 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
26920 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
26930 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61        current da
26940 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e  tabase image, in
26950 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a   pages, OR.**.**
26960 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67     b) if the pag
26970 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77  e content were w
26980 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74  ritten at this t
26990 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ime, it would no
269a0 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63  t.**      be nec
269b0 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
269c0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
269d0 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73  ent out to the s
269e0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
269f0 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65     (as determine
26a00 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75  d by function su
26a10 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
26a20 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
26a30 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74  condition assert
26a40 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
26a50 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
26a60 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69  e, and the.** di
26a70 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f  rty page were to
26a80 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72   be discarded fr
26a90 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61  om the cache via
26aa0 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73   the pagerStress
26ab0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70  ().** routine, p
26ac0 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75  agerStress() wou
26ad0 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  ld not write the
26ae0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
26af0 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ntent to.** the 
26b00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
26b10 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  f a savepoint tr
26b20 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72  ansaction were r
26b30 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
26b40 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65  .** this happene
26b50 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  d, the correct b
26b60 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65  ehavior would be
26b70 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
26b80 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
26b90 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
26ba0 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
26bb0 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
26bc0 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
26bd0 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
26be0 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
26bf0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
26c00 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
26c10 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
26c20 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
26c30 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
26c40 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
26c50 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
26c60 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
26c70 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
26c80 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
26c90 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
26ca0 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
26cb0 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
26cc0 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
26cd0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
26ce0 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
26cf0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26d00 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
26d10 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
26d20 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
26d30 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
26d40 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
26d50 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
26d60 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
26d70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
26d80 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
26d90 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26da0 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
26db0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
26dc0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
26dd0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
26de0 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
26df0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
26e00 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
26e10 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
26e20 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
26e30 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
26e40 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
26e50 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
26e60 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
26e70 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
26e80 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
26e90 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
26ea0 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
26eb0 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
26ec0 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
26ed0 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
26ee0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
26ef0 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
26f00 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
26f10 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
26f20 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
26f30 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
26f40 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
26f50 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26f60 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
26f70 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f   right before co
26f80 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
26f90 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20  action..** Once 
26fa0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
26fb0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74  s been called, t
26fc0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  he transaction m
26fd0 75 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a  ust either be.**
26fe0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20   rolled back or 
26ff0 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73  committed. It is
27000 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c   not safe to cal
27010 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
27020 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74  and.** then cont
27030 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20  inue writing to 
27040 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
27050 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
27060 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
27070 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
27080 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
27090 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
270a0 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
270b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
270c0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
270d0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
270e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
270f0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f  ze = nPage;..  /
27100 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
27110 68 65 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c  he code here cal
27120 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  led assertTrunca
27130 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74  teConstraint() t
27140 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68  o.  ** ensure th
27150 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69  at all pages bei
27160 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61 77 61  ng truncated awa
27170 79 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  y by this operat
27180 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66  ion are,.  ** if
27190 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
271a0 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e  epoints are open
271b0 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  , present in the
271c0 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
271d0 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74   journal so that
271e0 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73   they can be res
271f0 74 6f 72 65 64 20 69 66 20 74 68 65 20 73 61 76  tored if the sav
27200 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64  epoint is rolled
27210 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73  .  ** back. This
27220 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65   is no longer ne
27230 63 65 73 73 61 72 79 20 61 73 20 74 68 69 73 20  cessary as this 
27240 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
27250 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64  only.  ** called
27260 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f   right before co
27270 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
27280 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f  action. So altho
27290 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ugh the .  ** Pa
272a0 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73  ger object may s
272b0 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73  till have open s
272c0 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72  avepoints (Pager
272d0 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c  .nSavepoint!=0),
272e0 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e   .  ** they cann
272f0 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
27300 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72 74  k. So the assert
27310 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
27320 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69  nt() call.  ** i
27330 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72  s no longer corr
27340 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a  ect. */.}.../*.*
27350 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27360 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
27370 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f   attempting a ho
27380 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
27390 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20  ck. It.** syncs 
273a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
273b0 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73   to disk, then s
273c0 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ets pPager->jour
273d0 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a  nalHdr to the.**
273e0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
273f0 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61  rnal file so tha
27400 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  t the pager_play
27410 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b  back() routine k
27420 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  nows.** that the
27430 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20   entire journal 
27440 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79  file has been sy
27450 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63  nced..**.** Sync
27460 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
27470 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65  l to disk before
27480 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
27490 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75  oll it back ensu
274a0 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20  res .** that if 
274b0 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  a power-failure 
274c0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
274d0 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  e rollback, the 
274e0 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20  process that.** 
274f0 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63  attempts rollbac
27500 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74  k following syst
27510 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73  em recovery sees
27520 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61   the same journa
27530 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20  l.** content as 
27540 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  this process..**
27550 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
27560 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65  g goes as planne
27570 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
27580 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
27590 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69  ise, .** an SQLi
275a0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
275b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
275c0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
275d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
275e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
275f0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50  TE_OK;.  if( !pP
27600 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
27610 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27620 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
27630 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
27640 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69  NORMAL);.  }.  i
27650 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27660 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
27670 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
27680 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
27690 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
276a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
276b0 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  c;.}..#if SQLITE
276c0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
276d0 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  ./*.** Obtain a 
276e0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d  reference to a m
276f0 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
27700 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67  e object for pag
27710 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a  e number pgno. .
27720 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  ** The new objec
27730 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70  t will use the p
27740 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62  ointer pData, ob
27750 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74  tained from xFet
27760 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63  ch()..** If succ
27770 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50  essful, set *ppP
27780 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  age to point to 
27790 74 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66  the new page ref
277a0 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65  erence.** and re
277b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
277c0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
277d0 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
277e0 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a  r code and set.*
277f0 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72  * *ppPage to zer
27800 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65  o..**.** Page re
27810 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65  ferences obtaine
27820 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  d by calling thi
27830 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
27840 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a  d be released.**
27850 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65   by calling page
27860 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
27870 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
27880 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
27890 50 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  Page(.  Pager *p
278a0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
278b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
278c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e   object */.  Pgn
278d0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
278f0 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  Page number */. 
27900 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20   void *pData,   
27910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27920 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64   /* xFetch()'d d
27930 61 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67  ata for this pag
27940 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70  e */.  PgHdr **p
27950 70 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  pPage           
27960 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41         /* OUT: A
27970 63 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a  cquired page obj
27980 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  ect */.){.  PgHd
27990 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
279a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
279b0 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
279c0 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
279d0 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e   .  if( pPager->
279e0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b  pMmapFreelist ){
279f0 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
27a00 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70   = pPager->pMmap
27a10 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50  Freelist;.    pP
27a20 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27a30 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ist = p->pDirty;
27a40 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d  .    p->pDirty =
27a50 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
27a60 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 3d  pPager->nExtra>=
27a70 38 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  8 );.    memset(
27a80 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 38 29  p->pExtra, 0, 8)
27a90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
27aa0 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67  ppPage = p = (Pg
27ab0 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  Hdr *)sqlite3Mal
27ac0 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
27ad0 67 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e  gHdr) + pPager->
27ae0 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28  nExtra);.    if(
27af0 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p==0 ){.      s
27b00 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
27b10 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
27b20 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67  )(pgno-1) * pPag
27b30 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44  er->pageSize, pD
27b40 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
27b50 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
27b60 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
27b70 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69  p->pExtra = (voi
27b80 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70  d *)&p[1];.    p
27b90 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f  ->flags = PGHDR_
27ba0 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  MMAP;.    p->nRe
27bb0 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50  f = 1;.    p->pP
27bc0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
27bd0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d   }..  assert( p-
27be0 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a  >pExtra==(void *
27bf0 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65  )&p[1] );.  asse
27c00 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20  rt( p->pPage==0 
27c10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
27c20 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41  flags==PGHDR_MMA
27c30 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  P );.  assert( p
27c40 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
27c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
27c60 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70  >nRef==1 );..  p
27c70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
27c80 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74   p->pData = pDat
27c90 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d  a;.  pPager->nMm
27ca0 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75  apOut++;..  retu
27cb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27cc0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
27cd0 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
27ce0 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70  e to page pPg. p
27cf0 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  Pg must have bee
27d00 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  n returned by an
27d10 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c   .** earlier cal
27d20 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72  l to pagerAcquir
27d30 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  eMapPage()..*/.s
27d40 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
27d50 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50  ReleaseMapPage(P
27d60 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
27d70 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
27d80 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61  g->pPager;.  pPa
27d90 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b  ger->nMmapOut--;
27da0 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
27db0 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
27dc0 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72  eelist;.  pPager
27dd0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
27de0 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74  = pPg;..  assert
27df0 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
27e00 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e  ethods->iVersion
27e10 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=3 );.  sqlite3
27e20 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
27e30 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d  ->fd, (i64)(pPg-
27e40 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d  >pgno-1)*pPager-
27e50 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e  >pageSize, pPg->
27e60 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pData);.}../*.**
27e70 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20   Free all PgHdr 
27e80 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69  objects stored i
27e90 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61  n the Pager.pMma
27ea0 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a  pFreelist list..
27eb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
27ec0 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
27ed0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
27ee0 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67    PgHdr *p;.  Pg
27ef0 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Hdr *pNext;.  fo
27f00 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61  r(p=pPager->pMma
27f10 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d  pFreelist; p; p=
27f20 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
27f30 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
27f40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27f50 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  p);.  }.}.../*.*
27f60 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
27f70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
27f80 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
27f90 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
27fa0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
27fb0 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
27fc0 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
27fd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
27fe0 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
27ff0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
28000 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
28010 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
28020 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
28030 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
28040 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
28050 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
28060 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
28070 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
28080 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
28090 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
280a0 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
280b0 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
280c0 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
280d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
280e0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
280f0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
28100 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
28110 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
28120 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
28130 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
28140 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
28150 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
28160 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
28170 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
28180 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
28190 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
281a0 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
281b0 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
281c0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
281d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
281e0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 75 38  lite3 *db){.  u8
281f0 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70   *pTmp = (u8 *)p
28200 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
28210 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 20  ;..  assert( db 
28220 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
28230 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
28240 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
28250 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
28260 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73  ) );.  disable_s
28270 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
28280 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rs();.  sqlite3B
28290 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
282a0 28 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d  ();.  pagerFreeM
282b0 61 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a  apHdrs(pPager);.
282c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
282d0 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Code = 0; */.  p
282e0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
282f0 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Mode = 0;.#ifnde
28300 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
28310 4c 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 7c  L.  assert( db |
28320 7c 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d  | pPager->pWal==
28330 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
28340 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  lClose(pPager->p
28350 57 61 6c 2c 20 64 62 2c 20 70 50 61 67 65 72 2d  Wal, db, pPager-
28360 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20  >ckptSyncFlags, 
28370 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28380 2c 0a 20 20 20 20 20 20 28 64 62 20 26 26 20 28  ,.      (db && (
28390 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
283a0 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65  TE_NoCkptOnClose
283b0 29 20 3f 20 30 20 3a 20 70 54 6d 70 29 0a 20 20  ) ? 0 : pTmp).  
283c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61  );.  pPager->pWa
283d0 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  l = 0;.#endif.  
283e0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
283f0 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
28400 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
28410 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
28420 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
28430 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e   it is open, syn
28440 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
28450 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
28460 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  g UnlockAndRollb
28470 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ack..    ** If t
28480 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c  his is not done,
28490 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65   then an unsynce
284a0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
284b0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20   open journal . 
284c0 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62     ** file may b
284d0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e  e played back in
284e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
284f0 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
28500 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20  ure occurs .    
28510 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73  ** while this is
28520 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20   happening, the 
28530 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
28540 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20  ecome corrupt.. 
28550 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
28560 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
28570 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
28580 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
28590 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65  , shift the page
285a0 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  r.    ** into th
285b0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54  e ERROR state. T
285c0 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63  his causes Unloc
285d0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20  kAndRollback to 
285e0 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a  unlock the.    *
285f0 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  * database and c
28600 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
28610 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74   file without at
28620 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
28630 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20   it.    ** back 
28640 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20  or finalize it. 
28650 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73  The next databas
28660 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65  e user will have
28670 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e   to do hot-journ
28680 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  al.    ** rollba
28690 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73  ck before access
286a0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
286b0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
286c0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
286d0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 23 69 66  ger->jfd) ){.#if
286e0 20 30 0a 20 20 20 20 20 20 69 66 28 20 70 61 67   0.      if( pag
286f0 65 72 49 73 53 65 72 76 65 72 28 70 50 61 67 65  erIsServer(pPage
28700 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  r) ){.        as
28710 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
28720 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
28730 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
28740 53 49 53 54 20 29 3b 0a 20 20 20 20 20 20 20 20  SIST );.        
28750 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
28760 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
28770 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
28780 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 65          /* If ne
28790 63 65 73 73 61 72 79 2c 20 63 68 61 6e 67 65 20  cessary, change 
287a0 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  the pager state 
287b0 73 6f 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  so that the jour
287c0 6e 61 6c 20 66 69 6c 65 20 0a 20 20 20 20 20 20  nal file .      
287d0 20 20 2a 2a 20 69 73 20 64 65 6c 65 74 65 64 20    ** is deleted 
287e0 62 79 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70  by the call to p
287f0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
28800 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2e 20 20  lback() below.  
28810 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
28820 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
28830 41 47 45 52 5f 4f 50 45 4e 20 29 20 70 50 61 67  AGER_OPEN ) pPag
28840 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
28850 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 20  ER_READER;.     
28860 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
28870 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
28880 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74  er, pagerSyncHot
28890 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29  Journal(pPager))
288a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
288b0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
288c0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
288d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
288e0 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 69  RVER_EDITION.  i
288f0 66 28 20 70 61 67 65 72 49 73 53 65 72 76 65 72  f( pagerIsServer
28900 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
28910 73 71 6c 69 74 65 33 53 65 72 76 65 72 44 69 73  sqlite3ServerDis
28920 63 6f 6e 6e 65 63 74 28 70 50 61 67 65 72 2d 3e  connect(pPager->
28930 70 53 65 72 76 65 72 2c 20 70 50 61 67 65 72 2d  pServer, pPager-
28940 3e 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >fd);.    pPager
28950 2d 3e 70 53 65 72 76 65 72 20 3d 20 30 3b 0a 20  ->pServer = 0;. 
28960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
28970 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
28980 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  r->jfd);.  }.#en
28990 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 6e 64  dif.  sqlite3End
289a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
289b0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
289c0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
289d0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
289e0 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
289f0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
28a00 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
28a10 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
28a20 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ;.  sqlite3OsClo
28a30 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
28a40 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
28a50 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74  e(pTmp);.  sqlit
28a60 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50  e3PcacheClose(pP
28a70 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
28a80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
28a90 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
28aa0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
28ab0 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
28ac0 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
28ad0 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a  Codec);.#endif..
28ae0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
28af0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26  r->aSavepoint &&
28b00 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
28b10 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
28b20 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
28b30 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
28b40 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
28b50 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
28b60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
28b70 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
28b80 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
28b90 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
28ba0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
28bb0 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
28bc0 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
28bd0 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
28be0 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
28bf0 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
28c00 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
28c10 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
28c20 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
28c30 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
28c40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
28c50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
28c60 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
28c70 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
28c80 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
28c90 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
28ca0 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
28cb0 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
28cc0 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
28cd0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
28ce0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
28cf0 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
28d00 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
28d10 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
28d20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
28d30 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
28d40 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
28d50 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
28d60 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
28d70 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  c flag is set, t
28d80 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
28d90 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
28da0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
28db0 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
28dc0 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
28dd0 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20  ournal-mode and 
28de0 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63  the .** device c
28df0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
28e00 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
28e10 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
28e20 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
28e30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
28e40 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
28e50 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
28e60 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
28e70 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
28e80 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
28e90 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
28ea0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
28eb0 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
28ec0 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
28ed0 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
28ee0 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
28ef0 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
28f00 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
28f10 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
28f20 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
28f30 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
28f40 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
28f50 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
28f60 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
28f70 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
28f80 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
28f90 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
28fa0 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
28fb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28fc0 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
28fd0 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
28fe0 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
28ff0 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
29000 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
29010 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
29020 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
29030 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
29040 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
29050 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
29060 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
29070 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
29080 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
29090 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
290a0 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
290b0 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
290c0 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
290d0 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
290e0 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
290f0 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
29100 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
29110 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
29120 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
29130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
29140 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
29150 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
29160 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
29170 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
29180 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
29190 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
291a0 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
291b0 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
291c0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
291d0 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
291e0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
291f0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
29200 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
29210 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
29220 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
29230 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
29240 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
29250 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
29260 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
29270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29280 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
29290 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
292a0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
292b0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
292c0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
292d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
292e0 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
292f0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
29300 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
29310 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
29320 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
29330 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
29340 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
29350 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
29360 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
29370 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29380 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
29390 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
293a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
293b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
293c0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
293d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
293e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
293f0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
29400 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
29410 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
29420 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
29430 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
29440 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
29450 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
29460 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
29470 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
29480 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
29490 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
294a0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
294b0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
294c0 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
294d0 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
294e0 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
294f0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
29500 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
29510 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
29520 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
29530 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
29540 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
29550 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
29560 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
29570 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
29580 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
29590 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
295a0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
295b0 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
295c0 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
295d0 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
295e0 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
295f0 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
29600 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
29610 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
29620 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
29630 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
29640 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
29650 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
29660 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
29670 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
29680 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
29690 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
296a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
296b0 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
296c0 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
296d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
296e0 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
296f0 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
29700 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
29710 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
29720 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
29730 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
29740 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
29750 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
29760 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
29770 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
29780 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
29790 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
297a0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
297b0 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
297c0 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
297d0 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
297e0 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
297f0 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
29800 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
29810 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
29820 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29830 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
29840 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
29850 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
29860 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
29870 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
29880 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
29890 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
298a0 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
298b0 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
298c0 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
298d0 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
298e0 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
298f0 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
29900 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
29910 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
29920 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
29930 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
29940 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
29950 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
29960 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
29970 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
29980 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
29990 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
299a0 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
299b0 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
299c0 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
299d0 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
299e0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
299f0 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
29a00 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
29a10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29a20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
29a30 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
29a40 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
29a50 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
29a60 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
29a70 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
29a80 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
29a90 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
29aa0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
29ab0 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
29ac0 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
29ad0 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
29ae0 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
29af0 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
29b00 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
29b10 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
29b20 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
29b30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29b40 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
29b50 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
29b60 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
29b70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
29b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
29b90 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
29ba0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
29bb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
29bc0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
29bd0 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
29be0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
29bf0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
29c00 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
29c10 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
29c20 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
29c30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
29c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
29c50 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
29c60 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
29c70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
29c80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
29c90 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
29ca0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
29cb0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
29cc0 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
29cd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
29ce0 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
29cf0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
29d00 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
29d10 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
29d20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
29d30 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
29d40 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
29d50 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
29d60 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
29d70 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
29d80 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
29d90 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
29da0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
29db0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
29dc0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
29dd0 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
29de0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
29df0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
29e00 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
29e10 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
29e20 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
29e30 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
29e40 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
29e50 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
29e60 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
29e70 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
29e80 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
29e90 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
29ea0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
29eb0 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
29ec0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
29ed0 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
29ee0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
29ef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
29f00 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
29f10 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
29f20 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
29f30 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
29f40 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
29f50 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
29f60 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
29f70 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
29f80 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
29f90 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
29fa0 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
29fb0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
29fc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
29fd0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
29fe0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
29ff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a000 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a010 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
2a020 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
2a030 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
2a040 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
2a050 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
2a060 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2a070 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
2a080 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
2a090 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
2a0a0 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
2a0b0 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
2a0c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2a0d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a0e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a0f0 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
2a100 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
2a110 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
2a120 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
2a130 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
2a140 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
2a150 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2a160 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
2a170 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
2a180 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
2a190 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
2a1a0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
2a1b0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2a1c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
2a1d0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
2a1e0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
2a1f0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
2a200 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
2a210 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2a220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a230 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a240 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
2a250 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
2a260 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2a270 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
2a280 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
2a290 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
2a2a0 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
2a2b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
2a2c0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
2a2d0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
2a2e0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
2a2f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a300 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2a310 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2a320 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
2a330 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
2a340 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
2a350 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
2a360 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
2a370 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
2a380 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
2a390 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
2a3a0 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
2a3b0 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
2a3c0 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
2a3d0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
2a3e0 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
2a3f0 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
2a400 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
2a410 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
2a420 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2a430 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
2a440 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
2a450 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
2a460 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
2a470 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
2a480 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a490 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2a4a0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
2a4b0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
2a4c0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
2a4d0 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
2a4e0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
2a4f0 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
2a500 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
2a510 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
2a520 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
2a530 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
2a540 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
2a550 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2a560 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
2a570 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
2a580 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
2a590 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
2a5a0 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
2a5b0 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
2a5c0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
2a5d0 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
2a5e0 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
2a5f0 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
2a600 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
2a610 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
2a620 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
2a630 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a640 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
2a650 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
2a660 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2a670 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
2a680 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
2a690 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
2a6a0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2a6b0 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
2a6c0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
2a6d0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
2a6e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2a6f0 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
2a700 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
2a710 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
2a720 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
2a730 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
2a740 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
2a750 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
2a760 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
2a770 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
2a780 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
2a790 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
2a7a0 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
2a7b0 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
2a7c0 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
2a7d0 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
2a7e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2a7f0 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
2a800 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
2a810 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
2a820 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
2a830 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2a840 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
2a850 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
2a860 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
2a870 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
2a880 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
2a890 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
2a8a0 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
2a8b0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
2a8c0 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
2a8d0 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
2a8e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2a8f0 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
2a900 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
2a910 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
2a920 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
2a930 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
2a940 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
2a950 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
2a960 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
2a970 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
2a980 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
2a990 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
2a9a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2a9b0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
2a9c0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
2a9d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2a9e0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2a9f0 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
2aa00 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
2aa10 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2aa20 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
2aa30 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
2aa40 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
2aa50 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
2aa60 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2aa70 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
2aa80 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
2aa90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
2aaa0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
2aab0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2aac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aad0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2aae0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
2aaf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
2ab00 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
2ab10 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
2ab20 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
2ab30 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
2ab40 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
2ab50 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
2ab60 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
2ab70 6c 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  le || pPager->eS
2ab80 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
2ab90 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73  ER_DBMOD );.  as
2aba0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
2abb0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
2abc0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2abd0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2abe0 66 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44  fd) || pList->pD
2abf0 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 23 69 66 64  irty==0 );..#ifd
2ac00 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52  ef SQLITE_SERVER
2ac10 5f 45 44 49 54 49 4f 4e 0a 20 20 69 66 28 20 70  _EDITION.  if( p
2ac20 61 67 65 72 49 73 50 72 6f 63 65 73 73 53 65 72  agerIsProcessSer
2ac30 76 65 72 28 70 50 61 67 65 72 29 20 29 7b 0a 20  ver(pPager) ){. 
2ac40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
2ac50 65 72 76 65 72 50 72 65 43 6f 6d 6d 69 74 28 70  erverPreCommit(p
2ac60 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 2c 20  Pager->pServer, 
2ac70 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 50  pPager->pServerP
2ac80 61 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  age);.    pPager
2ac90 2d 3e 70 53 65 72 76 65 72 50 61 67 65 20 3d 20  ->pServerPage = 
2aca0 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  0;.    if( rc!=S
2acb0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2acc0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2acd0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
2ace0 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
2acf0 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
2ad00 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
2ad10 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
2ad20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
2ad30 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
2ad40 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
2ad50 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
2ad60 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
2ad70 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
2ad80 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
2ad90 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
2ada0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
2adb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2adc0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
2add0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2ade0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
2adf0 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
2ae00 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
2ae10 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
2ae20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2ae30 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  s);.  }..  /* Be
2ae40 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
2ae50 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56  rite, give the V
2ae60 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61  FS a hint of wha
2ae70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
2ae80 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20   file size will 
2ae90 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  be..  */.  asser
2aea0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2aeb0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
2aec0 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20  r->fd) );.  if( 
2aed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
2aee0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48    && pPager->dbH
2aef0 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  intSize<pPager->
2af00 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c  dbSize.   && (pL
2af10 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70  ist->pDirty || p
2af20 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  List->pgno>pPage
2af30 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20  r->dbHintSize). 
2af40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2af50 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70  int64 szFile = p
2af60 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
2af70 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  * (sqlite3_int64
2af80 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
2af90 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
2afa0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
2afb0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
2afc0 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
2afd0 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20  , &szFile);.    
2afe0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
2aff0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
2b000 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ize;.  }..  whil
2b010 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2b020 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
2b030 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69   Pgno pgno = pLi
2b040 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f  st->pgno;..    /
2b050 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
2b060 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
2b070 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
2b080 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
2b090 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
2b0a0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
2b0b0 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
2b0c0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
2b0d0 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c  Image() was call
2b0e0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
2b0f0 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
2b100 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
2b110 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
2b120 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
2b130 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
2b140 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
2b150 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
2b160 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20  ** Also, do not 
2b170 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61  write out any pa
2b180 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ge that has the 
2b190 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2b1a0 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74   flag.    ** set
2b1b0 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33   (set by sqlite3
2b1c0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
2b1d0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
2b1e0 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
2b1f0 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
2b200 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
2b210 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
2b220 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2b230 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
2b240 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
2b250 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  e;   /* Offset t
2b260 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  o write */.     
2b270 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20   char *pData;   
2b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2a0 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65  /* Data to write
2b2b0 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61   */    ..      a
2b2c0 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66  ssert( (pList->f
2b2d0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2b2e0 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
2b2f0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
2b300 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
2b310 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
2b320 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20  (pList);..      
2b330 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61  /* Encode the da
2b340 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
2b350 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
2b360 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e  List->pData, pgn
2b370 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 6, return SQL
2b380 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
2b390 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  pData);..      /
2b3a0 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20  * Write out the 
2b3b0 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20  page data. */.  
2b3c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b3d0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2b3e0 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
2b3f0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
2b400 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  set);..      /* 
2b410 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75  If page 1 was ju
2b420 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  st written, upda
2b430 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  te Pager.dbFileV
2b440 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20  ers to match.   
2b450 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
2b460 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68  now stored in th
2b470 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2b480 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73   If writing this
2b490 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20   .      ** page 
2b4a0 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62  caused the datab
2b4b0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
2b4c0 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53  , update dbFileS
2b4d0 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ize. .      */. 
2b4e0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31       if( pgno==1
2b4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
2b500 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
2b510 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
2b520 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
2b530 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
2b540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2b550 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
2b560 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
2b570 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2b580 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
2b590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2b5a0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
2b5b0 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b  ER_STAT_WRITE]++
2b5c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
2b5d0 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
2b5e0 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
2b5f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2b600 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
2b610 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
2b620 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
2b630 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
2b640 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
2b650 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
2b660 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
2b670 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
2b680 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
2b690 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
2b6a0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
2b6b0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
2b6c0 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
2b6d0 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
2b6e0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
2b6f0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
2b700 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
2b710 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
2b720 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73  count);.    }els
2b730 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
2b740 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
2b750 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2b760 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
2b770 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
2b780 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
2b790 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  sh(pList);.    p
2b7a0 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
2b7b0 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  irty;.  }..  ret
2b7c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b7d0 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   Ensure that the
2b7e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
2b7f0 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74  e is open. If it
2b800 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
2b810 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
2b820 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2b830 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2b840 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
2b850 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
2b860 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
2b870 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  . An .** SQLITE_
2b880 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
2b890 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2b8a0 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   if a call to sq
2b8b0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a  lite3OsOpen() .*
2b8c0 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * fails..*/.stat
2b8d0 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
2b8e0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2b8f0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2b900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2b910 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
2b920 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 63  ->sjfd) ){.    c
2b930 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
2b940 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55    SQLITE_OPEN_SU
2b950 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51 4c 49 54  BJOURNAL | SQLIT
2b960 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2b970 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45   .      | SQLITE
2b980 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
2b990 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
2b9a0 53 49 56 45 20 0a 20 20 20 20 20 20 7c 20 53 51  SIVE .      | SQ
2b9b0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
2b9c0 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 69 6e 74  ONCLOSE;.    int
2b9d0 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 73 71   nStmtSpill = sq
2b9e0 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d  lite3Config.nStm
2b9f0 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69 66 28 20  tSpill;.    if( 
2ba00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2ba10 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2ba20 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c  ALMODE_MEMORY ||
2ba30 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
2ba40 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 6e  emory ){.      n
2ba50 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d 31 3b 0a  StmtSpill = -1;.
2ba60 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
2ba70 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
2ba80 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
2ba90 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  0, pPager->sjfd,
2baa0 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74 53 70 69   flags, nStmtSpi
2bab0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ll);.  }.  retur
2bac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2bad0 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
2bae0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
2baf0 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
2bb00 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2bb10 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  al. .**.** If su
2bb20 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
2bb30 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
2bb40 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
2bb50 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
2bb60 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
2bb70 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
2bb80 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
2bb90 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2bba0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2bbb0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
2bbc0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
2bbd0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
2bbe0 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
2bbf0 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
2bc00 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2bc10 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
2bc20 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
2bc30 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
2bc40 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
2bc50 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
2bc60 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
2bc70 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
2bc80 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
2bc90 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
2bca0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
2bcb0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2bcc0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
2bcd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2bce0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2bcf0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20  LMODE_OFF ){..  
2bd00 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75    /* Open the su
2bd10 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  b-journal, if it
2bd20 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
2bd30 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a   been opened */.
2bd40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2bd50 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2bd60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2bd70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2bd80 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  ) || pagerUseWal
2bd90 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2bda0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2bdb0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20  Pager->sjfd) || 
2bdc0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d  pPager->nSubRec=
2bdd0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2bde0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2bdf0 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20  ager) .         
2be00 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  || pageInJournal
2be10 28 70 50 61 67 65 72 2c 20 70 50 67 29 20 0a 20  (pPager, pPg) . 
2be20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e          || pPg->
2be30 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
2be40 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a  rigSize .    );.
2be50 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62      rc = openSub
2be60 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
2be70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2be80 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  sub-journal was 
2be90 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66 75  opened successfu
2bea0 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65  lly (or was alre
2beb0 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a  ady open),.    *
2bec0 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72  * write the jour
2bed0 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  nal record into 
2bee0 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20  the file.  */.  
2bef0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bf00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69  _OK ){.      voi
2bf10 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
2bf20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34  pData;.      i64
2bf30 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70   offset = (i64)p
2bf40 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28  Pager->nSubRec*(
2bf50 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
2bf60 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ze);.      char 
2bf70 2a 70 44 61 74 61 32 3b 0a 0a 23 69 66 20 53 51  *pData2;..#if SQ
2bf80 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 20  LITE_HAS_CODEC  
2bf90 20 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61   .      if( !pPa
2bfa0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
2bfb0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 43 4f 44  y ){.        COD
2bfc0 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
2bfd0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
2bfe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2bff0 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61  OMEM_BKPT, pData
2c000 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  2);.      }else.
2c010 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 44 61  #endif.      pDa
2c020 74 61 32 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  ta2 = pData;.   
2c030 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2c040 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
2c050 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2c060 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2c070 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2c080 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
2c090 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
2c0a0 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
2c0b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2c0c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c0d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c0e0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2c0f0 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
2c100 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2c110 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
2c120 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2c130 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c140 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
2c150 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
2c160 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c170 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
2c180 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
2c190 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
2c1a0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2c1b0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2c1c0 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e   rc;.}.static in
2c1d0 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
2c1e0 49 66 52 65 71 75 69 72 65 64 28 50 67 48 64 72  IfRequired(PgHdr
2c1f0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75   *pPg){.  if( su
2c200 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
2c210 50 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Pg) ){.    retur
2c220 6e 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  n subjournalPage
2c230 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (pPg);.  }else{.
2c240 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c250 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
2c260 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2c270 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
2c280 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77  e pcache layer w
2c290 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68  hen it has reach
2c2a0 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20  ed some.** soft 
2c2b0 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68  memory limit. Th
2c2c0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
2c2d0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2c2e0 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a   a Pager object.
2c2f0 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f  ** (cast as a vo
2c300 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20  id*). The pager 
2c310 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65  is always 'purge
2c320 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e  able' (not an in
2c330 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
2c340 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ase). The second
2c350 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72   argument is a r
2c360 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61  eference to a pa
2c370 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63  ge that is .** c
2c380 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62  urrently dirty b
2c390 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  ut has no outsta
2c3a0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
2c3b0 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  . The page.** is
2c3c0 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74   always associat
2c3d0 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65  ed with the Page
2c3e0 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
2c3f0 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  as the first .**
2c400 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
2c410 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
2c420 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20   function is to 
2c430 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62  make pPg clean b
2c440 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f  y writing its co
2c450 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f  ntents.** out to
2c460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c470 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  le, if possible.
2c480 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76   This may involv
2c490 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a  e syncing the.**
2c4a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
2c4b0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2c4c0 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63  ful, sqlite3Pcac
2c4d0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2c4e0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70   called on the p
2c4f0 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  age and.** SQLIT
2c500 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
2c510 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
2c520 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
2c530 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  g to make the.**
2c540 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65   page clean, the
2c550 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2c560 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74  s returned. If t
2c570 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  he page cannot b
2c580 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20  e.** made clean 
2c590 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72  for some other r
2c5a0 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72  eason, but no er
2c5b0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
2c5c0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
2c5d0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2c5e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2c5f0 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  ean() is not cal
2c600 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
2c610 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76  nt pagerStress(v
2c620 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70  oid *p, PgHdr *p
2c630 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
2c640 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
2c650 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
2c660 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
2c670 70 61 67 65 72 49 73 53 65 72 76 65 72 28 70 50  pagerIsServer(pP
2c680 61 67 65 72 29 20 29 20 72 65 74 75 72 6e 20 53  ager) ) return S
2c690 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2c6a0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
2c6b0 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ==pPager );.  as
2c6c0 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
2c6d0 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
2c6e0 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  /* The doNotS
2c6f0 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20  pill NOSYNC bit 
2c700 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69  is set during ti
2c710 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61  mes when doing a
2c720 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f   sync of.  ** jo
2c730 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e  urnal (and addin
2c740 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20  g a new header) 
2c750 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20  is not allowed. 
2c760 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a   This occurs.  *
2c770 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74  * during calls t
2c780 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
2c790 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69  ite() while tryi
2c7a0 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75  ng to journal mu
2c7b0 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65  ltiple.  ** page
2c7c0 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
2c7d0 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a  he same sector..
2c7e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f    **.  ** The do
2c7f0 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43  NotSpill ROLLBAC
2c800 4b 20 61 6e 64 20 4f 46 46 20 62 69 74 73 20 69  K and OFF bits i
2c810 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68  nhibits all cach
2c820 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20  e spilling.  ** 
2c830 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2c840 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73  ether or not a s
2c850 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e  ync is required.
2c860 20 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75    This is set du
2c870 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c  ring.  ** a roll
2c880 62 61 63 6b 20 6f 72 20 62 79 20 75 73 65 72 20  back or by user 
2c890 72 65 71 75 65 73 74 2c 20 72 65 73 70 65 63 74  request, respect
2c8a0 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ively..  **.  **
2c8b0 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73   Spilling is als
2c8c0 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65  o prohibited whe
2c8d0 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  n in an error st
2c8e0 61 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63  ate since that c
2c8f0 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74  ould.  ** lead t
2c900 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
2c910 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20  ption.   In the 
2c920 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
2c930 74 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20  tation it .  ** 
2c940 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f  is impossible fo
2c950 72 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  r sqlite3PcacheF
2c960 65 74 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c  etch() to be cal
2c970 6c 65 64 20 77 69 74 68 20 63 72 65 61 74 65 46  led with createF
2c980 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c  lag==3.  ** whil
2c990 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  e in the error s
2c9a0 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69  tate, hence it i
2c9b0 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72  s impossible for
2c9c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
2c9d0 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
2c9e0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
2c9f0 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  te.  Nevertheles
2ca00 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20  s, we include a 
2ca10 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73  NEVER().  ** tes
2ca20 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20  t for the error 
2ca30 73 74 61 74 65 20 61 73 20 61 20 73 61 66 65 67  state as a safeg
2ca40 75 61 72 64 20 61 67 61 69 6e 73 74 20 66 75 74  uard against fut
2ca50 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a  ure changes..  *
2ca60 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
2ca70 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
2ca80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ca90 4b 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  K;.  testcase( p
2caa0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2cab0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
2cac0 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65 73 74  LLBACK );.  test
2cad0 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2cae0 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2caf0 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65  FLAG_OFF );.  te
2cb00 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2cb10 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2cb20 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b  LLFLAG_NOSYNC );
2cb30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2cb40 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26 26 20  oNotSpill.   && 
2cb50 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ((pPager->doNotS
2cb60 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41  pill & (SPILLFLA
2cb70 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c  G_ROLLBACK|SPILL
2cb80 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20  FLAG_OFF))!=0.  
2cb90 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61      || (pPg->fla
2cba0 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f  gs & PGHDR_NEED_
2cbb0 53 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20  SYNC)!=0).  ){. 
2cbc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cbd0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d  _OK;.  }..  pPg-
2cbe0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69  >pDirty = 0;.  i
2cbf0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
2cc00 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
2cc10 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   Write a single 
2cc20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70  frame for this p
2cc30 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20  age to the log. 
2cc40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a  */.    rc = subj
2cc50 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75  ournalPageIfRequ
2cc60 69 72 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20  ired(pPg); .    
2cc70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2cc80 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2cc90 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70  pagerWalFrames(p
2cca0 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30  Pager, pPg, 0, 0
2ccb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2ccc0 7b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  {.    .#ifdef SQ
2ccd0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
2cce0 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  H_ATOMIC_WRITE. 
2ccf0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74     if( pPager->t
2cd00 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  empFile==0 ){.  
2cd10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cd20 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
2cd30 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
2cd40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cd50 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 70 61 67  _OK ) return pag
2cd60 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2cd70 20 72 63 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   rc);.    }.#end
2cd80 69 66 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e  if.  .    /* Syn
2cd90 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
2cda0 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  le if required. 
2cdb0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  */.    if( pPg->
2cdc0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2cdd0 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70  _SYNC .     || p
2cde0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2cdf0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
2ce00 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20  EMOD.    ){.    
2ce10 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
2ce20 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  al(pPager, 1);. 
2ce30 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
2ce40 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
2ce50 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75  s of the page ou
2ce60 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2ce70 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
2ce80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ce90 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2cea0 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
2ceb0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
2cec0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
2ced0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2cee0 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67  list(pPager, pPg
2cef0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2cf00 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
2cf10 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20   as clean. */.  
2cf20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2cf30 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  K ){.    PAGERTR
2cf40 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20  ACE(("STRESS %d 
2cf50 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2cf60 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2cf70 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71  ->pgno));.    sq
2cf80 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2cf90 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  lean(pPg);.  }..
2cfa0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
2cfb0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2cfc0 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  ; .}../*.** Flus
2cfd0 68 20 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63  h all unreferenc
2cfe0 65 64 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ed dirty pages t
2cff0 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o disk..*/.int s
2d000 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68  qlite3PagerFlush
2d010 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2d020 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
2d030 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69  er->errCode;.  i
2d040 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
2d050 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20   PgHdr *pList = 
2d060 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
2d070 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
2d080 50 43 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73  PCache);.    ass
2d090 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
2d0a0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
2d0b0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  );.    while( rc
2d0c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2d0d0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67  List ){.      Pg
2d0e0 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
2d0f0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
2d100 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65    if( pList->nRe
2d110 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
2d120 72 63 20 3d 20 70 61 67 65 72 53 74 72 65 73 73  rc = pagerStress
2d130 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20  ((void*)pPager, 
2d140 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
2d150 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e        pList = pN
2d160 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
2d170 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d180 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2d190 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  nd initialize a 
2d1a0 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74  new Pager object
2d1b0 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
2d1c0 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a  er to it.** in *
2d1d0 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67  ppPager. The pag
2d1e0 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75  er should eventu
2d1f0 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79  ally be freed by
2d200 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74   passing it.** t
2d210 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  o sqlite3PagerCl
2d220 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ose()..**.** The
2d230 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d   zFilename argum
2d240 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20  ent is the path 
2d250 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2d260 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a  file to open..**
2d270 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
2d280 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
2d290 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
2d2a0 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
2d2b0 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
2d2c0 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
2d2d0 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70   be cached. Temp
2d2e0 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20  orary files are 
2d2f0 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
2d300 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
2d310 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64   they are closed
2d320 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  . If zFilename i
2d330 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
2d340 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d  n .** all inform
2d350 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
2d360 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65   cache. It is ne
2d370 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
2d380 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61  isk. .** This ca
2d390 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
2d3a0 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d  lement an in-mem
2d3b0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
2d3c0 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70  .** The nExtra p
2d3d0 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69  arameter specifi
2d3e0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
2d3f0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2d400 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f  allocated.** alo
2d410 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67  ng with each pag
2d420 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69  e reference. Thi
2d430 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  s space is avail
2d440 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
2d450 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69  .** via the sqli
2d460 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
2d470 28 29 20 41 50 49 2e 20 20 57 68 65 6e 20 61 20  () API.  When a 
2d480 6e 65 77 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  new page is allo
2d490 63 61 74 65 64 2c 20 74 68 65 0a 2a 2a 20 66 69  cated, the.** fi
2d4a0 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
2d4b0 68 69 73 20 73 70 61 63 65 20 61 72 65 20 7a 65  his space are ze
2d4c0 72 6f 65 64 20 62 75 74 20 74 68 65 20 72 65 6d  roed but the rem
2d4d0 61 69 6e 64 65 72 20 69 73 20 75 6e 69 6e 69 74  ainder is uninit
2d4e0 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20 28 54 68 65  ialized..** (The
2d4f0 20 65 78 74 72 61 20 73 70 61 63 65 20 69 73 20   extra space is 
2d500 75 73 65 64 20 62 79 20 62 74 72 65 65 20 61 73  used by btree as
2d510 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
2d520 65 63 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ect.).**.** The 
2d530 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
2d540 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
2d550 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
2d560 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
2d570 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
2d580 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
2d590 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
2d5a0 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
2d5b0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
2d5c0 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a  AGER_* flags..**
2d5d0 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73  .** The vfsFlags
2d5e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
2d5f0 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20  bitmask to pass 
2d600 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  to the flags par
2d610 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
2d620 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20   xOpen() method 
2d630 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
2d640 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  VFS when opening
2d650 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   files. .**.** I
2d660 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
2d670 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2d680 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
2d690 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a  d file opened .*
2d6a0 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
2d6b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2d6c0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
2d6d0 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  er set to point 
2d6e0 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61  to.** the new pa
2d6f0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
2d700 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d710 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20  *ppPager is set 
2d720 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65  to NULL.** and e
2d730 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
2d740 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
2d750 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
2d760 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71  ITE_NOMEM.** (sq
2d770 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73  lite3Malloc() is
2d780 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
2d790 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54  e memory), SQLIT
2d7a0 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a  E_CANTOPEN or .*
2d7b0 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45  * various SQLITE
2d7c0 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a  _IO_XXX errors..
2d7d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2d7e0 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
2d7f0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2d800 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
2d810 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
2d820 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
2d830 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
2d840 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
2d850 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
2d860 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2d870 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2d880 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
2d890 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2d8a0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
2d8b0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
2d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d8d0 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
2d8e0 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
2d8f0 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2d900 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2d910 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2d920 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
2d930 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
2d940 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
2d950 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
2d960 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
2d970 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
2d980 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  n() */.  void (*
2d990 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
2d9a0 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ) /* Function to
2d9b0 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   reinitialize pa
2d9c0 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ges */.){.  u8 *
2d9d0 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
2d9e0 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Pager = 0;      
2d9f0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2da00 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
2da10 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
2da20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2da30 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2da40 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
2da50 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  mpFile = 0;     
2da60 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
2da70 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e  emp files (incl.
2da80 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
2da90 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62  ) */.  int memDb
2daa0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2dab0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2dac0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2dad0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  file */.  int re
2dae0 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
2daf0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2db00 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
2db10 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2db20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
2db30 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2db40 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
2db50 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
2db60 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
2db70 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
2db80 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
2db90 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
2dba0 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
2dbb0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2dbc0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
2dbd0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
2dbe0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
2dbf0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
2dc00 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
2dc10 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
2dc20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2dc30 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
2dc40 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2dc50 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
2dc60 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2dc70 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33  r PCache */.  u3
2dc80 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  2 szPageDflt = S
2dc90 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2dca0 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
2dcb0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
2dcc0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2dcd0 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20  zUri = 0;    /* 
2dce0 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79  URI args to copy
2dcf0 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   */.  int nUri =
2dd00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
2dd10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2dd20 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74  s of URI args at
2dd30 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20   *zUri */..  /* 
2dd40 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
2dd50 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
2dd60 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
2dd70 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2dd80 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
2dd90 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
2dda0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
2ddb0 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
2ddc0 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75  rnal).  */.  jou
2ddd0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
2dde0 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75  OUND8(sqlite3Jou
2ddf0 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b  rnalSize(pVfs));
2de00 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
2de10 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
2de20 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61  o NULL in case a
2de30 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
2de40 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
2de50 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2de60 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
2de70 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50  .  if( flags & P
2de80 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  AGER_MEMORY ){. 
2de90 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
2dea0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2deb0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2dec0 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  ){.      zPathna
2ded0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
2dee0 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d  rDup(0, zFilenam
2def0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  e);.      if( zP
2df00 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65  athname==0  ) re
2df10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2df20 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50  M_BKPT;.      nP
2df30 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2df40 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2df50 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c  ame);.      zFil
2df60 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  ename = 0;.    }
2df70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2df80 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
2df90 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
2dfa0 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
2dfb0 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
2dfc0 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
2dfd0 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
2dfe0 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
2dff0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
2e000 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
2e010 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
2e020 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
2e030 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
2e040 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2e050 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2e060 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73  e[0] ){.    cons
2e070 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e  t char *z;.    n
2e080 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
2e090 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
2e0a0 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
2e0b0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
2e0c0 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32  w(0, nPathname*2
2e0d0 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
2e0e0 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
2e0f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2e100 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
2e110 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30  .    zPathname[0
2e120 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73  ] = 0; /* Make s
2e130 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ure initialized 
2e140 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68  even if FullPath
2e150 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a  name() fails */.
2e160 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e170 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
2e180 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
2e190 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68  nPathname, zPath
2e1a0 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68  name);.    nPath
2e1b0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2e1c0 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2e1d0 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20  );.    z = zUri 
2e1e0 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c  = &zFilename[sql
2e1f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
2e200 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20  lename)+1];.    
2e210 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
2e220 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53     z += sqlite3S
2e230 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20  trlen30(z)+1;.  
2e240 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2e250 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2e260 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20     }.    nUri = 
2e270 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55  (int)(&z[1] - zU
2e280 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ri);.    assert(
2e290 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20   nUri>=0 );.    
2e2a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e2b0 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38  K && nPathname+8
2e2c0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
2e2d0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
2e2e0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
2e2f0 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  en when the jour
2e300 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65  nal path require
2e310 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  d by.      ** th
2e320 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
2e330 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20   opened will be 
2e340 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e  more than pVfs->
2e350 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20  mxPathname.     
2e360 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e   ** bytes in len
2e370 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  gth. This means 
2e380 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
2e390 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20  not be opened,. 
2e3a0 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69       ** as it wi
2e3b0 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
2e3c0 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
2e3d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65  ournal file or e
2e3e0 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65  ven.      ** che
2e3f0 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ck for a hot-jou
2e400 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64  rnal before read
2e410 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
2e420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e430 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2e440 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
2e450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e460 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2e470 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2e480 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2e490 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2e4a0 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
2e4b0 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
2e4c0 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
2e4d0 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
2e4e0 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
2e4f0 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
2e500 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2e510 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
2e520 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
2e530 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
2e540 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
2e550 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
2e560 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
2e570 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2e580 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
2e590 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
2e5a0 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
2e5b0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2e5c0 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
2e5d0 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
2e5e0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2e5f0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
2e600 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
2e610 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
2e620 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
2e630 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2e640 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
2e650 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
2e660 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
2e670 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2e680 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
2e690 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2e6a0 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2e6b0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
2e6c0 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2e6d0 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
2e6e0 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
2e6f0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2e700 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2e710 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
2e720 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
2e730 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
2e740 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
2e750 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2e760 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
2e770 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2e780 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
2e790 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
2e7a0 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
2e7b0 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
2e7c0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
2e7d0 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
2e7e0 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
2e7f0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2e800 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
2e810 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
2e820 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
2e830 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
2e840 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20   + nUri +       
2e850 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
2e860 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
2e870 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 8 + 2         
2e880 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
2e890 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2e8a0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2e8b0 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20  + nPathname + 4 
2e8c0 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2f  + 2            /
2e8d0 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66  * zWal */.#endif
2e8e0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
2e8f0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2e900 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
2e910 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
2e920 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
2e930 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
2e940 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2e950 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2e960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2e970 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
2e980 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20  pPager =        
2e990 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70        (Pager*)(p
2e9a0 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Ptr);.  pPager->
2e9b0 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43  pPCache =    (PC
2e9c0 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  ache*)(pPtr += R
2e9d0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2e9e0 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65  ager)));.  pPage
2e9f0 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74  r->fd =   (sqlit
2ea00 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2ea10 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53  = ROUND8(pcacheS
2ea20 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ize));.  pPager-
2ea30 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >sjfd = (sqlite3
2ea40 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2ea50 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
2ea60 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65  sFile));.  pPage
2ea70 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74  r->jfd =  (sqlit
2ea80 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2ea90 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2eaa0 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
2eab0 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68  ilename =    (ch
2eac0 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  ar*)(pPtr += jou
2ead0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
2eae0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2eaf0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50  YTE_ALIGNMENT(pP
2eb00 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
2eb10 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2eb20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20  Pager.zFilename 
2eb30 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e  and Pager.zJourn
2eb40 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72  al buffers, if r
2eb50 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
2eb60 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ( zPathname ){. 
2eb70 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74 68     assert( nPath
2eb80 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50  name>0 );.    pP
2eb90 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
2eba0 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
2ebb0 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31  += nPathname + 1
2ebc0 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65   + nUri);.    me
2ebd0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
2ebe0 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
2ebf0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2ec00 20 20 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65     if( nUri ) me
2ec10 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46  mcpy(&pPager->zF
2ec20 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d  ilename[nPathnam
2ec30 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69  e+1], zUri, nUri
2ec40 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2ec50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2ec60 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2ec70 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2ec80 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
2ec90 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
2eca0 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20  "-journal\000", 
2ecb0 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  8+2);.    sqlite
2ecc0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61  3FileSuffix3(pPa
2ecd0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2ece0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2ecf0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2ed00 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70  E_OMIT_WAL.    p
2ed10 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70  Pager->zWal = &p
2ed20 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2ed30 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a  nPathname+8+1];.
2ed40 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2ed50 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61  r->zWal, zPathna
2ed60 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2ed70 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2ed80 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61  er->zWal[nPathna
2ed90 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c  me], "-wal\000",
2eda0 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74   4+1);.    sqlit
2edb0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50  e3FileSuffix3(pP
2edc0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2edd0 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a   pPager->zWal);.
2ede0 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2edf0 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2ee00 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
2ee10 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
2ee20 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
2ee30 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
2ee40 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
2ee50 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
2ee60 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2ee70 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2ee80 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75  ] ){.    int fou
2ee90 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2eea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
2eeb0 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2eec0 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  by xOpen() */.  
2eed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2eee0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2eef0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2ef00 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61  ager->fd, vfsFla
2ef10 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20  gs, &fout);.    
2ef20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29  assert( !memDb )
2ef30 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
2ef40 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
2ef50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
2ef60 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
2ef70 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
2ef80 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
2ef90 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
2efa0 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61  .    ** choose a
2efb0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2efc0 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61  ze in case we ha
2efd0 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ve to create the
2efe0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2eff0 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
2f000 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
2f010 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
2f020 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2f030 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
2f040 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
2f050 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
2f060 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
2f070 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
2f080 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b  ze().    **    +
2f090 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
2f0a0 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
2f0b0 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
2f0c0 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  cally..    */.  
2f0d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f0e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
2f0f0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
2f100 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2f110 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
2f120 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 65  );.      if( !re
2f130 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
2f140 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2f150 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
2f160 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44   assert(SQLITE_D
2f170 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2f180 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2f190 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
2f1a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50  .        if( szP
2f1b0 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
2f1c0 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
2f1d0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2f1e0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
2f1f0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2f200 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
2f210 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2f220 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
2f230 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2f240 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20  SIZE;.          
2f250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2f260 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2f270 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63  (u32)pPager->sec
2f280 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
2f290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
2f2a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2f2b0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2f2c0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2f2d0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
2f2e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2f2f0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2f300 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
2f310 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2f320 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2f330 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
2f340 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
2f350 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
2f360 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2f370 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
2f380 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73          for(ii=s
2f390 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53  zPageDflt; ii<=S
2f3a0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2f3b0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
2f3c0 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
2f3d0 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
2f3e0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
2f3f0 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
2f400 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2f410 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20  Dflt = ii;.     
2f420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
2f440 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
2f450 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f      pPager->noLo
2f460 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  ck = sqlite3_uri
2f470 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61  _boolean(zFilena
2f480 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29  me, "nolock", 0)
2f490 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 63  ;.      if( (iDc
2f4a0 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
2f4b0 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20  IMMUTABLE)!=0.  
2f4c0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
2f4d0 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c  uri_boolean(zFil
2f4e0 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c  ename, "immutabl
2f4f0 65 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  e", 0) ){.      
2f500 20 20 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20      vfsFlags |= 
2f510 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f520 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20  ONLY;.          
2f530 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65  goto act_like_te
2f540 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d  mp_file;.      }
2f550 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2f560 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70      /* If a temp
2f570 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65  orary file is re
2f580 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e  quested, it is n
2f590 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69  ot opened immedi
2f5a0 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e  ately..    ** In
2f5b0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63   this case we ac
2f5c0 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74  cept the default
2f5d0 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64   page size and d
2f5e0 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20  elay actually.  
2f5f0 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65    ** opening the
2f600 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20   file until the 
2f610 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73  first call to Os
2f620 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Write()..    **.
2f630 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
2f640 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66  ch is also run f
2f650 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
2f660 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d  database. An in-
2f670 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61  memory.    ** da
2f680 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61  tabase is the sa
2f690 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c  me as a temp-fil
2f6a0 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20  e that is never 
2f6b0 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20  written out to. 
2f6c0 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75     ** disk and u
2f6d0 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ses an in-memory
2f6e0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2f6f0 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
2f700 20 54 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73   This branch als
2f710 6f 20 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73  o runs for files
2f720 20 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74   marked as immut
2f730 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63  able..    */ .ac
2f740 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65  t_like_temp_file
2f750 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d  :.    tempFile =
2f760 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2f770 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
2f780 45 41 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72  EADER;     /* Pr
2f790 65 74 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79  etend we already
2f7a0 20 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a   have a lock */.
2f7b0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
2f7c0 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  k = EXCLUSIVE_LO
2f7d0 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e  CK;    /* Preten
2f7e0 64 20 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c  d we are in EXCL
2f7f0 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20  USIVE mode */.  
2f800 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b    pPager->noLock
2f810 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2f820 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f       /* Do no lo
2f830 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61  cking */.    rea
2f840 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67  dOnly = (vfsFlag
2f850 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s&SQLITE_OPEN_RE
2f860 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20  ADONLY);.  }..  
2f870 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2f880 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65   call to PagerSe
2f890 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76  tPagesize() serv
2f8a0 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61  es to set the va
2f8b0 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67  lue of .  ** Pag
2f8c0 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20  er.pageSize and 
2f8d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
2f8e0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
2f8f0 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  buffer..  */.  i
2f900 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f910 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2f920 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
2f930 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2f940 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
2f950 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a  size(pPager, &sz
2f960 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20  PageDflt, -1);. 
2f970 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
2f980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2f990 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
2f9a0 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
2f9b0 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72  ject. */.  if( r
2f9c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f9d0 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55      nExtra = ROU
2f9e0 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20  ND8(nExtra);.   
2f9f0 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
2fa00 3d 38 20 26 26 20 6e 45 78 74 72 61 3c 31 30 30  =8 && nExtra<100
2fa10 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
2fa20 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28  lite3PcacheOpen(
2fa30 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74  szPageDflt, nExt
2fa40 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20  ra, !memDb,.    
2fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa60 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53     !memDb?pagerS
2fa70 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a  tress:0, (void *
2fa80 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  )pPager, pPager-
2fa90 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a  >pPCache);.  }..
2faa0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2fab0 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c   occurred above,
2fac0 20 66 72 65 65 20 74 68 65 20 20 50 61 67 65 72   free the  Pager
2fad0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
2fae0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20  lose the file.. 
2faf0 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51   */.  if( rc!=SQ
2fb00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2fb10 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
2fb20 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
2fb30 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
2fb40 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
2fb50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2fb60 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
2fb70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2fb80 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
2fb90 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
2fba0 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
2fbb0 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
2fbc0 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  >zFilename));.  
2fbd0 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
2fbe0 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
2fbf0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2fc00 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e  me))..  pPager->
2fc10 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
2fc20 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f  )useJournal;.  /
2fc30 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
2fc40 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
2fc50 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
2fc60 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2fc70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
2fc80 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2fc90 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
2fca0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2fcb0 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
2fcc0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
2fcd0 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
2fce0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
2fcf0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
2fd00 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
2fd10 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2fd20 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a  _UNLOCK; */.  /*
2fd30 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2fd40 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2fd50 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
2fd60 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
2fd70 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
2fd80 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2fd90 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
2fda0 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
2fdb0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2fdc0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2fdd0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2fde0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2fdf0 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
2fe00 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2fe10 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
2fe20 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
2fe30 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2fe40 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2fe50 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
2fe60 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
2fe70 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
2fe80 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
2fe90 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  y;.  assert( use
2fea0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
2feb0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2fec0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2fed0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2fee0 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  le;.  if( pPager
2fef0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2ff00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ff10 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  fullSync==0 );. 
2ff20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ff30 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30 20  r->extraSync==0 
2ff40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ff50 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2ff60 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2ff70 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t( pPager->walSy
2ff80 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2ff90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ffa0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d  ->ckptSyncFlags=
2ffb0 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
2ffc0 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
2ffd0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ync = 1;.    pPa
2ffe0 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d  ger->extraSync =
2fff0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
30000 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
30010 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
30020 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
30030 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
30040 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20  E_SYNC_NORMAL | 
30050 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
30060 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65  TIONS;.    pPage
30070 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
30080 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
30090 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
300a0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
300b0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
300c0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
300d0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
300e0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
300f0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
30100 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74  xtra = (u16)nExt
30110 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
30120 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
30130 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
30140 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
30150 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  IT;.  assert( is
30160 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
30170 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a   || tempFile );.
30180 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
30190 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
301a0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
301b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
301c0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
301d0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20  URNALMODE_OFF;. 
301e0 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62   }else if( memDb
301f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
30200 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
30210 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
30220 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a  MEMORY;.  }.  /*
30230 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
30240 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
30250 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
30260 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20  HandlerArg = 0; 
30270 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  */.  pPager->xRe
30280 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
30290 3b 0a 20 20 73 65 74 47 65 74 74 65 72 4d 65 74  ;.  setGetterMet
302a0 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  hod(pPager);.  /
302b0 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
302c0 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
302d0 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
302e0 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  ); */.  /* pPage
302f0 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49  r->szMmap = SQLI
30300 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f  TE_DEFAULT_MMAP_
30310 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20  SIZE // will be 
30320 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a  set by btree.c *
30330 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  /..  *ppPager = 
30340 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
30350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
30360 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
30370 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30380 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65   has not be dele
30390 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f  ted or renamed o
303a0 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72  ut from.** under
303b0 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74   the pager.  Ret
303c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
303d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
303e0 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f   still were it o
303f0 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e  ught.** to be on
30400 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e   disk.  Return n
30410 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f  on-zero (SQLITE_
30420 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
30430 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
30440 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f  rror.** code fro
30450 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  m sqlite3OsAcces
30460 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61  s()) if the data
30470 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69  base has gone mi
30480 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssing..*/.static
30490 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55   int databaseIsU
304a0 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50  nmoved(Pager *pP
304b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61  ager){.  int bHa
304c0 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e  sMoved = 0;.  in
304d0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
304e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20  ger->tempFile ) 
304f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30500 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
30510 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75  dbSize==0 ) retu
30520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30530 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30540 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61  zFilename && pPa
30550 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30  ger->zFilename[0
30560 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ] );.  rc = sqli
30570 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
30580 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
30590 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
305a0 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29  VED, &bHasMoved)
305b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
305c0 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
305d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53     /* If the HAS
305e0 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74  _MOVED file-cont
305f0 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65  rol is unimpleme
30600 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61  nted, assume tha
30610 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  t the file.    *
30620 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  * has not been m
30630 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20 74  oved.  That is t
30640 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65  he historical be
30650 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65  havior of SQLite
30660 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a  : prior to.    *
30670 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c  * version 3.8.3,
30680 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65   it never checke
30690 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  d */.    rc = SQ
306a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
306b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
306c0 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20  OK && bHasMoved 
306d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
306e0 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
306f0 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VED;.  }.  retur
30700 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
30710 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
30720 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72   called after tr
30730 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
30740 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f   PAGER_UNLOCK to
30750 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44  .** PAGER_SHARED
30760 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73   state. It tests
30770 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
30780 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65  ot journal prese
30790 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c  nt in.** the fil
307a0 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
307b0 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20   given pager. A 
307c0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
307d0 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64  ne that .** need
307e0 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
307f0 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74  ack. According t
30800 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
30810 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
30820 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66  * file exists if
30830 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
30840 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a  riteria are met:
30850 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a  .**.**   * The j
30860 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
30870 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73  ts in the file s
30880 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20  ystem, and.**   
30890 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c  * No process hol
308a0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ds a RESERVED or
308b0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
308c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
308d0 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  le, and.**   * T
308e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
308f0 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74   itself is great
30900 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20  er than 0 bytes 
30910 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20  in size, and.** 
30920 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79    * The first by
30930 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  te of the journa
30940 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
30950 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a  d is not 0x00..*
30960 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
30970 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
30980 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
30990 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
309a0 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
309b0 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
309c0 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
309d0 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
309e0 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
309f0 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
30a00 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e name. In this 
30a10 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
30a20 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74   file is.** just
30a30 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f   deleted using O
30a40 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74  sDelete, *pExist
30a50 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  s is set to 0 an
30a60 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  d SQLITE_OK.** i
30a70 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
30a80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
30a90 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66  oes not check if
30aa0 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74   there is a mast
30ab0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
30ac0 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ame.** at the en
30ad0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49  d of the file. I
30ae0 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20  f there is, and 
30af0 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  that master jour
30b00 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73  nal file.** does
30b10 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
30b20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30b30 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
30b40 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20  hot. In this.** 
30b50 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
30b60 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  e will return a 
30b70 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20  false-positive. 
30b80 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
30b90 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
30ba0 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68  will discover th
30bb0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
30bc0 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
30bd0 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69  y hot and .** wi
30be0 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62  ll not roll it b
30bf0 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ack. .**.** If a
30c00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
30c10 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78  e is found to ex
30c20 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ist, *pExists is
30c30 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a   set to 1 and .*
30c40 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
30c50 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d  rned. If no hot-
30c60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30c70 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74  present, *pExist
30c80 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  s is.** set to 0
30c90 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
30ca0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
30cb0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
30cc0 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
30cd0 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
30ce0 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74  her or not a hot
30cf0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78  -journal file ex
30d00 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72  ists, the IO err
30d10 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65  or.** code is re
30d20 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
30d30 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73  alue of *pExists
30d40 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
30d50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
30d60 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
30d70 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
30d80 45 78 69 73 74 73 2c 20 69 6e 74 20 2a 70 65 53  Exists, int *peS
30d90 65 72 76 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  erver){.  sqlite
30da0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
30db0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
30dc0 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
30dd0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
30de0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30df0 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74  e */.  int exist
30e00 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
30e10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30e20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
30e30 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
30e40 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21  nt jrnlOpen = !!
30e50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
30e60 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fd);..  assert( 
30e70 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
30e80 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
30e90 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
30ea0 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
30eb0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30ec0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20  PAGER_OPEN );.. 
30ed0 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65   assert( jrnlOpe
30ee0 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65  n==0 || ( sqlite
30ef0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
30f00 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
30f10 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49  >jfd) &.    SQLI
30f20 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
30f30 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20  ABLE_WHEN_OPEN. 
30f40 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73   ));..  *pExists
30f50 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
30f60 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
30f70 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
30f80 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
30f90 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
30fa0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
30fb0 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
30fc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30fd0 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
30fe0 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20     int locked = 
30ff0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
31000 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
31010 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
31020 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
31030 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
31040 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20  ERVER_EDITION.  
31050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31060 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
31070 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
31080 43 4e 54 4c 5f 53 45 52 56 45 52 5f 4d 4f 44 45  CNTL_SERVER_MODE
31090 2c 20 70 65 53 65 72 76 65 72 29 3b 0a 20 20 20  , peServer);.   
310a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
310b0 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
310c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
310d0 5f 4f 4b 20 7c 7c 20 2a 70 65 53 65 72 76 65 72  _OK || *peServer
310e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
310f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
31100 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
31110 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
31120 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
31130 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
31140 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
31150 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
31160 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
31170 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
31180 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
31190 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
311a0 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
311b0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
311c0 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
311d0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
311e0 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
311f0 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
31200 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
31210 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
31220 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
31230 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
31240 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
31250 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
31260 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
31270 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
31280 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
31290 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
312a0 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
312b0 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
312c0 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
312d0 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
312e0 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
312f0 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
31300 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
31310 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
31320 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
31330 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
31340 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
31350 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ocked ){.      P
31360 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
31370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31380 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
31390 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
313a0 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
313b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
313c0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  e==0 );.      rc
313d0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
313e0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
313f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
31400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31410 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
31420 64 61 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f  database is zero
31430 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20   pages in size, 
31440 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
31450 65 69 74 68 65 72 20 28 31 29 20 74 68 65 0a 20  either (1) the. 
31460 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
31470 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66  l is a remnant f
31480 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61  rom a prior data
31490 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
314a0 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20  me name where.  
314b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
314c0 61 62 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e  abase file but n
314d0 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  ot the journal w
314e0 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28  as deleted, or (
314f0 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20  2) the initial. 
31500 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
31510 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c  ction that popul
31520 61 74 65 73 20 61 20 6e 65 77 20 64 61 74 61 62  ates a new datab
31530 61 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ase is being rol
31540 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  led back..      
31550 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63    ** In either c
31560 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ase, the journal
31570 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c   file can be del
31580 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20  eted.  However, 
31590 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20  take care.      
315a0 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65    ** not to dele
315b0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
315c0 69 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  ile if it is alr
315d0 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f  eady open due to
315e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
315f0 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
31600 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
31610 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
31620 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29  0 && !jrnlOpen )
31630 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
31640 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
31650 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
31660 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44    if( pagerLockD
31670 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  b(pPager, RESERV
31680 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
31690 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
316a0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
316b0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
316c0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
316d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
316e0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
316f0 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c  eMode ) pagerUnl
31700 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
31710 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
31720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31730 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
31740 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
31750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31760 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
31770 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
31780 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  and no other con
31790 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65  nection has a re
317a0 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20  served.         
317b0 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c   ** or greater l
317c0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
317d0 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68  ase file. Now ch
317e0 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
317f0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
31800 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d  t least one non-
31810 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
31820 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
31830 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
31840 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
31850 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63  re is, then we c
31860 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75  onsider this jou
31870 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20  rnal to be hot. 
31880 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20  If not, .       
31890 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
318a0 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20  ignored..       
318b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
318c0 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
318d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
318e0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
318f0 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
31900 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
31910 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
31920 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
31930 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
31940 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
31950 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a  r->jfd, f, &f);.
31960 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31970 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31990 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20         u8 first 
319a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
319b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
319c0 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
319d0 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c   (void *)&first,
319e0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
319f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31a00 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
31a10 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
31a20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31a30 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
31a40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
31a50 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
31a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
31a70 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
31a80 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
31a90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31aa0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
31ab0 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
31ac0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
31ad0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
31ae0 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
31af0 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
31b00 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
31b10 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
31b20 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
31b30 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
31b40 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72   ** it has a zer
31b50 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d  o header, that m
31b60 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61  ight be due to a
31b70 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a  n I/O error, or.
31b80 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
31b90 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
31ba0 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69  o the race condi
31bb0 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61  tion described a
31bc0 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20  bove and in.    
31bd0 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65          ** ticke
31be0 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72  t #3883.  Either
31bf0 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61   way, assume tha
31c00 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
31c10 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20   hot..          
31c20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
31c30 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  be a false posit
31c40 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20  ive.  But if it 
31c50 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  is, then the.   
31c60 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f           ** auto
31c70 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c  matic journal pl
31c80 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76  ayback and recov
31c90 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69  ery mechanism wi
31ca0 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20  ll deal.        
31cb0 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75      ** with it u
31cc0 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56  nder an EXCLUSIV
31cd0 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20  E lock where we 
31ce0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20  do not need to. 
31cf0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f             ** wo
31d00 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68  rry so much with
31d10 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
31d20 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
31d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
31d40 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  xists = 1;.     
31d50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31d60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
31d70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
31d80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
31d90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31da0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
31db0 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 73 74 61  RVER_EDITION.sta
31dc0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 65 72  tic int pagerSer
31dd0 76 65 72 43 6f 6e 6e 65 63 74 28 50 61 67 65 72  verConnect(Pager
31de0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 53   *pPager, int eS
31df0 65 72 76 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  erver){.  int rc
31e00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
31e10 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
31e20 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  File==0 ){.    p
31e30 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20  Pager->noLock = 
31e40 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  1;.    pPager->j
31e50 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
31e60 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
31e70 45 52 53 49 53 54 3b 0a 20 20 20 20 72 63 20 3d  ERSIST;.    rc =
31e80 20 73 71 6c 69 74 65 33 53 65 72 76 65 72 43 6f   sqlite3ServerCo
31e90 6e 6e 65 63 74 28 70 50 61 67 65 72 2c 20 65 53  nnect(pPager, eS
31ea0 65 72 76 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  erver, &pPager->
31eb0 70 53 65 72 76 65 72 29 3b 0a 20 20 7d 0a 20 20  pServer);.  }.  
31ec0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
31ed0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  t sqlite3PagerRo
31ee0 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 61  llbackJournal(Pa
31ef0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c  ger *pPager, sql
31f00 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 66 64 29  ite3_file *pJfd)
31f10 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
31f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f30 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
31f40 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
31f50 66 69 6c 65 20 2a 73 61 76 65 64 5f 6a 66 64 20  file *saved_jfd 
31f60 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64 3b 0a 20  = pPager->jfd;. 
31f70 20 75 38 20 73 61 76 65 64 5f 65 53 74 61 74 65   u8 saved_eState
31f80 20 3d 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74   = pPager->eStat
31f90 65 3b 0a 20 20 75 38 20 73 61 76 65 64 5f 65 4c  e;.  u8 saved_eL
31fa0 6f 63 6b 20 3d 20 70 50 61 67 65 72 2d 3e 65 4c  ock = pPager->eL
31fb0 6f 63 6b 3b 0a 20 20 69 36 34 20 73 61 76 65 64  ock;.  i64 saved
31fc0 5f 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  _journalOff = pP
31fd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
31fe0 3b 0a 20 20 69 36 34 20 73 61 76 65 64 5f 6a 6f  ;.  i64 saved_jo
31ff0 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
32000 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 0a  r->journalHdr;..
32010 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32020 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
32030 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32040 5f 50 45 52 53 49 53 54 20 29 3b 0a 0a 20 20 70  _PERSIST );..  p
32050 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45  Pager->eLock = E
32060 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
32070 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
32080 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  = PAGER_WRITER_D
32090 42 4d 4f 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e  BMOD;.  pPager->
320a0 6a 66 64 20 3d 20 70 4a 66 64 3b 0a 20 20 72 63  jfd = pJfd;.  rc
320b0 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
320c0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
320d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
320e0 5f 4f 4b 20 29 20 72 63 20 3d 20 70 61 67 65 72  _OK ) rc = pager
320f0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
32100 2c 20 31 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  , 1);..  assert(
32110 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
32120 6a 66 64 29 20 29 3b 0a 20 20 70 50 61 67 65 72  jfd) );.  pPager
32130 2d 3e 6a 66 64 20 3d 20 73 61 76 65 64 5f 6a 66  ->jfd = saved_jf
32140 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  d;.  pPager->eSt
32150 61 74 65 20 3d 20 73 61 76 65 64 5f 65 53 74 61  ate = saved_eSta
32160 74 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 4c  te;.  pPager->eL
32170 6f 63 6b 20 3d 20 73 61 76 65 64 5f 65 4c 6f 63  ock = saved_eLoc
32180 6b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  k;.  pPager->jou
32190 72 6e 61 6c 4f 66 66 20 3d 20 73 61 76 65 64 5f  rnalOff = saved_
321a0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
321b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
321c0 20 3d 20 73 61 76 65 64 5f 6a 6f 75 72 6e 61 6c   = saved_journal
321d0 48 64 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Hdr;.  return rc
321e0 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
321f0 33 50 61 67 65 72 53 65 72 76 65 72 4a 6f 75 72  3PagerServerJour
32200 6e 61 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50  nal(.  Pager *pP
32210 61 67 65 72 2c 20 0a 20 20 73 71 6c 69 74 65 33  ager, .  sqlite3
32220 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a 20 20 63 6f  _file *jfd,.  co
32230 6e 73 74 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  nst char *zJourn
32240 61 6c 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  al.){.  pPager->
32250 7a 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72  zJournal = (char
32260 2a 29 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  *)zJournal;.  pP
32270 61 67 65 72 2d 3e 6a 66 64 20 3d 20 6a 66 64 3b  ager->jfd = jfd;
32280 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
32290 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
322a0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
322b0 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
322c0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
322d0 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73  e file..** It is
322e0 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
322f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
32300 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  () until after t
32310 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
32320 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
32330 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66  fully called. If
32340 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69   a shared-lock i
32350 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77  s already held w
32360 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  hen.** this func
32370 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
32380 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
32390 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
323a0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  ng operations ar
323b0 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64  e also performed
323c0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
323d0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66  n..**.**   1) If
323e0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75   the pager is cu
323f0 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52  rrently in PAGER
32400 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20  _OPEN state (no 
32410 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20  lock held.**    
32420 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73    on the databas
32430 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e  e file), then an
32440 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
32450 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20   to obtain a.** 
32460 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b       SHARED lock
32470 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
32480 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65   file. Immediate
32490 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
324a0 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53  ng.**      the S
324b0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
324c0 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63  file-system is c
324d0 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74  hecked for a hot
324e0 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20  -journal,.**    
324f0 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65    which is playe
32500 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e  d back if presen
32510 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79  t. Following any
32520 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   hot-journal .**
32530 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20        rollback, 
32540 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
32550 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61  the cache are va
32560 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b  lidated by check
32570 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
32580 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27  'change-counter'
32590 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61   field of the da
325a0 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
325b0 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64  er and.**      d
325c0 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79  iscarded if they
325d0 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65   are found to be
325e0 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20   invalid..**.** 
325f0 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65    2) If the page
32600 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
32610 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20  exclusive-mode, 
32620 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75  and there are cu
32630 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20  rrently.**      
32640 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
32650 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79  eferences to any
32660 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69   pages, and is i
32670 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
32680 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20  e,.**      then 
32690 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
326a0 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  de to clear the 
326b0 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64  error state by d
326c0 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20  iscarding.**    
326d0 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
326e0 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
326f0 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63   and rolling bac
32700 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e  k any open journ
32710 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e  al.**      file.
32720 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
32730 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
32740 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
32750 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
32760 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
32770 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69  curs while locki
32780 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ng the database,
32790 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20   checking for a 
327a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
327b0 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20   or .** rolling 
327c0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
327d0 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ile, the IO erro
327e0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
327f0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
32800 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
32810 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
32820 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 29 7b   int bReadonly){
32830 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
32840 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
32850 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
32860 63 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  code */.#ifdef S
32870 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49  QLITE_SERVER_EDI
32880 54 49 4f 4e 0a 20 20 69 6e 74 20 65 53 65 72 76  TION.  int eServ
32890 65 72 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  er = 0;.#endif..
328a0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
328b0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
328c0 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
328d0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
328e0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
328f0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
32900 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
32910 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
32920 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
32930 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
32940 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
32950 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
32960 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
32970 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
32980 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
32990 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73   mode.  */.  ass
329a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
329b0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
329c0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
329d0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
329e0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
329f0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
32a00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
32a10 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
32a20 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
32a30 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
32a40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
32a50 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
32a60 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
32a70 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
32a80 61 67 65 72 29 20 0a 20 20 20 26 26 20 21 70 61  ager) .   && !pa
32a90 67 65 72 49 73 53 65 72 76 65 72 28 70 50 61 67  gerIsServer(pPag
32aa0 65 72 29 20 0a 20 20 20 26 26 20 70 50 61 67 65  er) .   && pPage
32ab0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32ac0 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74  _OPEN ){.    int
32ad0 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31   bHotJournal = 1
32ae0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
32af0 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ue if there exis
32b00 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ts a hot journal
32b10 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73  -file */..    as
32b20 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
32b30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32b40 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
32b50 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
32b60 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
32b70 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61   );..    rc = pa
32b80 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
32b90 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
32ba0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
32bb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
32bd0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ager->eLock==NO_
32be0 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  LOCK || pPager->
32bf0 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
32c00 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  OCK );.      got
32c10 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
32c20 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
32c30 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
32c40 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
32c50 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
32c60 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
32c70 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
32c80 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
32c90 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
32ca0 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
32cb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
32cc0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48  Pager->eLock<=SH
32cd0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
32ce0 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f     rc = hasHotJo
32cf0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62  urnal(pPager, &b
32d00 48 6f 74 4a 6f 75 72 6e 61 6c 2c 20 26 65 53 65  HotJournal, &eSe
32d10 72 76 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  rver);.      ass
32d20 65 72 74 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c  ert( bHotJournal
32d30 3d 3d 30 20 7c 7c 20 65 53 65 72 76 65 72 3d 3d  ==0 || eServer==
32d40 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 );.    }.    i
32d50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32d60 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
32d70 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
32d80 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c   if( bHotJournal
32d90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
32da0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
32db0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
32dc0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
32dd0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
32de0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
32df0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
32e00 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
32e10 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
32e20 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
32e30 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
32e40 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
32e50 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
32e60 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
32e70 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
32e80 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
32e90 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
32ea0 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
32eb0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
32ec0 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
32ed0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
32ee0 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
32ef0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
32f00 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
32f10 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
32f20 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
32f30 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
32f40 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
32f50 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
32f60 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
32f70 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
32f80 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
32f90 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
32fa0 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
32fb0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
32fc0 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
32fd0 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
32fe0 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
32ff0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
33000 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
33010 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
33020 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
33030 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
33040 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
33050 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
33060 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
33070 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
33080 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
33090 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  ** Unless the pa
330a0 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e  ger is in lockin
330b0 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
330c0 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
330d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e  is.      ** down
330e0 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 44  graded to SHARED
330f0 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69  _LOCK before thi
33100 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
33110 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ns..      */.   
33120 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
33130 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c  kDb(pPager, EXCL
33140 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
33150 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33160 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33170 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
33180 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
33190 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
331a0 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68  eady open and th
331b0 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e  e file exists on
331c0 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20   disk, open the 
331d0 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
331e0 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
331f0 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20 61   access. Write a
33200 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72 65  ccess is require
33210 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20 20  d because .     
33220 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65   ** in exclusive
33230 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
33240 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
33250 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
33260 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  en .      ** and
33270 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
33280 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
33290 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c   later on. Also,
332a0 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20   write-access . 
332b0 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c       ** is usual
332c0 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  ly required to f
332d0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
332e0 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  nal in journal_m
332f0 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20  ode=persist .   
33300 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20     ** mode (and 
33310 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c  also for journal
33320 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f  _mode=truncate o
33330 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e  n some systems).
33340 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
33350 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
33360 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
33370 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61  , it usually mea
33380 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20  ns that some .  
33390 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
333a0 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20  nection managed 
333b0 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f  to get in and ro
333c0 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72  ll it back befor
333d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  e .      ** this
333e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
333f0 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
33400 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
33410 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  r, it .      ** 
33420 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68  may mean that th
33430 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74  e pager was in t
33440 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
33450 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a  hen this.      *
33460 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
33470 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f  alled and the jo
33480 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
33490 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
334a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
334b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
334c0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  d) ){.        sq
334d0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
334e0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
334f0 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69  >pVfs;.        i
33500 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20 20  nt bExists;     
33510 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
33520 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
33530 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20   exists */.     
33540 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
33550 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
33560 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
33570 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
33580 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
33590 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20  S, &bExists);.  
335a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
335b0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73  LITE_OK && bExis
335c0 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ts ){.          
335d0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
335e0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
335f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
33600 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
33610 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
33620 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
33630 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
33640 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
33650 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
33660 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
33670 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
33680 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
33690 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
336a0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
336b0 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
336c0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
336d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
336e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
336f0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
33700 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
33710 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
33720 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
33730 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
33740 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
33750 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
33760 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
33770 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
33780 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
33790 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
337a0 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
337b0 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
337c0 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
337d0 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
337e0 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68  d lock. Purge th
337f0 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20  e cache before. 
33800 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20       ** playing 
33810 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75  back the hot-jou
33820 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20  rnal so that we 
33830 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74  don't end up wit
33840 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  h.      ** an in
33850 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65  consistent cache
33860 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20  .  Sync the hot 
33870 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
33880 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  laying.      ** 
33890 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68  it back since th
338a0 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
338b0 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20  rashed and left 
338c0 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a  the hot journal.
338d0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
338e0 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69  y did not sync i
338f0 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71  t and we are req
33900 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20  uired to always 
33910 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68  sync.      ** th
33920 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
33930 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b   playing it back
33940 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33950 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
33960 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
33970 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
33980 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
33990 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
339a0 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
339b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
339c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
339d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
339e0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
339f0 6b 28 70 50 61 67 65 72 2c 20 21 70 50 61 67 65  k(pPager, !pPage
33a00 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
33a10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
33a20 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
33a30 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  PEN;.        }. 
33a40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
33a50 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
33a60 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  eMode ){.       
33a70 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
33a80 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
33a90 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  CK);.      }..  
33aa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33ac0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
33ad0 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65  is taken if an e
33ae0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
33af0 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e  e trying to open
33b00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72  .        ** or r
33b10 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  oll back a hot-j
33b20 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c  ournal while hol
33b30 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
33b40 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
33b50 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c      ** pager_unl
33b60 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ock() routine wi
33b70 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  ll be called bef
33b80 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  ore returning to
33b90 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20   unlock.        
33ba0 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  ** the file. If 
33bb0 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d  the unlock attem
33bc0 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50  pt fails, then P
33bd0 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20  ager.eLock must 
33be0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  be.        ** se
33bf0 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
33c00 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  K (see the comme
33c10 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
33c20 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20  fine for .      
33c30 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43    ** UNKNOWN_LOC
33c40 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65  K above for an e
33c50 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20  xplanation). .  
33c60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
33c70 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20   ** In order to 
33c80 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  get pager_unlock
33c90 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73  () to do this, s
33ca0 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  et Pager.eState 
33cb0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41  to.        ** PA
33cc0 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54  GER_ERROR now. T
33cd0 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
33ce0 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61  lly counted as a
33cf0 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20   transition.    
33d00 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20      ** to ERROR 
33d10 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61  state in the sta
33d20 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68  te diagram at th
33d30 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69  e top of this fi
33d40 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  le,.        ** s
33d50 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
33d60 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20  t the same call 
33d70 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
33d80 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20  ) will very.    
33d90 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74      ** shortly t
33da0 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61  ransition the pa
33db0 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ger object to th
33dc0 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61  e OPEN state. Ca
33dd0 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  lling.        **
33de0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
33df0 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c  ate() would fail
33e00 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75   now, as it shou
33e10 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ld not be possib
33e20 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  le.        ** to
33e30 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61   be in ERROR sta
33e40 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  te when there ar
33e50 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69  e zero outstandi
33e60 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20  ng page .       
33e70 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a   ** references..
33e80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33e90 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
33ea0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
33eb0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
33ec0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33ed0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33ee0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
33ef0 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EN );.      asse
33f00 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
33f10 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
33f20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
33f30 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
33f40 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
33f50 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  >eLock>SHARED_LO
33f60 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  CK).      );.   
33f70 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
33f80 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
33f90 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
33fa0 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20  SharedLock ){.  
33fb0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
33fc0 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
33fd0 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 74 68  been acquired th
33fe0 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20  en check to.    
33ff0 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20    ** see if the 
34000 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
34010 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
34020 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
34030 20 63 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20   changed,.      
34040 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  ** flush the cac
34050 68 65 2e 20 20 54 68 65 20 68 61 73 48 65 6c 64  he.  The hasHeld
34060 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67 20  SharedLock flag 
34070 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 66 72  prevents this fr
34080 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  om.      ** occu
34090 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76 65 72  rring on the ver
340a0 79 20 66 69 72 73 74 20 61 63 63 65 73 73 20 74  y first access t
340b0 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64  o a file, in ord
340c0 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20 20 20  er to save a.   
340d0 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e     ** single unn
340e0 65 63 65 73 73 61 72 79 20 73 71 6c 69 74 65 33  ecessary sqlite3
340f0 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20 61 74  OsRead() call at
34100 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e 0a 20   the start-up.. 
34110 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
34120 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
34130 73 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  s are detected b
34140 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
34150 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
34160 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
34170 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
34180 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
34190 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
341a0 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  tes are.      **
341b0 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
341c0 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
341d0 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
341e0 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
341f0 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
34200 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
34210 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
34220 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
34230 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
34240 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a   in use..      *
34250 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  * .      ** Ther
34260 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
34270 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
34280 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
34290 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
342a0 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
342b0 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
342c0 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
342d0 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
342e0 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  at.      ** it c
342f0 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
34300 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34310 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
34320 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
34330 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20  bFileVers)];..  
34340 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
34350 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
34360 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
34370 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
34380 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
34390 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
343a0 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
343b0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
343c0 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 69 66  ), 24);.      if
343d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
343e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
343f0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
34400 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
34410 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
34420 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
34430 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
34440 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 6d  TE_OK;.        m
34450 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
34460 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
34470 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
34480 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
34490 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
344a0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
344b0 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
344c0 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
344d0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
344e0 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
344f0 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65      /* Unmap the
34500 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
34510 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
34520 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f  hat external pro
34530 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a  cesses.        *
34540 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63  * may have trunc
34550 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73  ated the databas
34560 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20  e file and then 
34570 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b  extended it back
34580 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  .        ** to i
34590 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
345a0 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
345b0 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64  ess was not hold
345c0 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20  ing a lock..    
345d0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
345e0 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78  ase there may ex
345f0 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70  ist a Pager.pMap
34600 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70   mapping that ap
34610 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  pears.        **
34620 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74   to be the right
34630 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74   size but is not
34640 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e   actually valid.
34650 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20   Avoid this.    
34660 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69      ** possibili
34670 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20  ty by unmapping 
34680 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a  the db here. */.
34690 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46          if( USEF
346a0 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a  ETCH(pPager) ){.
346b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
346c0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
346d0 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
346e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
346f0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
34700 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54  LITE_SERVER_EDIT
34710 49 4f 4e 0a 20 20 20 20 69 66 28 20 65 53 65 72  ION.    if( eSer
34720 76 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ver ){.      rc 
34730 3d 20 70 61 67 65 72 53 65 72 76 65 72 43 6f 6e  = pagerServerCon
34740 6e 65 63 74 28 70 50 61 67 65 72 2c 20 65 53 65  nect(pPager, eSe
34750 72 76 65 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  rver);.    }.#en
34760 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
34770 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
34780 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
34790 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
347a0 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
347b0 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
347c0 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
347d0 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
347e0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
347f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34810 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
34820 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
34830 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  t(pPager);.    }
34840 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34850 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73  OMIT_WAL.    ass
34860 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
34870 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  l==0 || rc==SQLI
34880 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a  TE_OK );.#endif.
34890 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
348a0 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f  TE_SERVER_EDITIO
348b0 4e 0a 20 20 69 66 28 20 70 61 67 65 72 49 73 53  N.  if( pagerIsS
348c0 65 72 76 65 72 28 70 50 61 67 65 72 29 20 29 7b  erver(pPager) ){
348d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
348e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
348f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34900 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
34910 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20  Pager)==0 );.   
34920 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
34930 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
34940 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
34950 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
34960 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 72 76  rc = sqlite3Serv
34970 65 72 42 65 67 69 6e 28 70 50 61 67 65 72 2d 3e  erBegin(pPager->
34980 70 53 65 72 76 65 72 2c 20 62 52 65 61 64 6f 6e  pServer, bReadon
34990 6c 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ly);.    if( rc=
349a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
349b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
349c0 53 65 72 76 65 72 4c 6f 63 6b 28 70 50 61 67 65  ServerLock(pPage
349d0 72 2d 3e 70 53 65 72 76 65 72 2c 20 31 2c 20 30  r->pServer, 1, 0
349e0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
349f0 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
34a00 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 23 65 6e  pPager);.  }.#en
34a10 64 69 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  dif.  if( rc==SQ
34a20 4c 49 54 45 5f 4f 4b 20 26 26 20 70 61 67 65 72  LITE_OK && pager
34a30 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
34a40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
34a50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
34a60 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67     rc = pagerBeg
34a70 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
34a80 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  n(pPager);.  }..
34a90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
34aa0 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70 50 61  mpFile==0 && pPa
34ab0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
34ac0 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53  ER_OPEN && rc==S
34ad0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34ae0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
34af0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61  unt(pPager, &pPa
34b00 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
34b10 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
34b20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34b30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
34b40 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67  MEMDB );.    pag
34b50 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
34b60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
34b70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
34b80 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d  AGER_OPEN );.  }
34b90 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
34ba0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
34bb0 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61  _READER;.    pPa
34bc0 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
34bd0 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  edLock = 1;.  }.
34be0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34bf0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
34c00 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
34c10 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
34c20 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
34c30 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
34c40 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
34c50 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
34c60 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
34c70 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
34c80 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
34c90 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
34ca0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
34cb0 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
34cc0 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
34cd0 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
34ce0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
34cf0 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
34d00 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
34d10 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
34d20 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
34d30 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
34d40 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
34d50 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20  er->nMmapOut==0 
34d60 26 26 20 28 73 71 6c 69 74 65 33 50 63 61 63 68  && (sqlite3Pcach
34d70 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
34d80 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29  ->pPCache)==0) )
34d90 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  {.    pagerUnloc
34da0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
34db0 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
34dc0 2a 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74  ** The page gett
34dd0 65 72 20 6d 65 74 68 6f 64 73 20 65 61 63 68 20  er methods each 
34de0 74 72 79 20 74 6f 20 61 63 71 75 69 72 65 20 61  try to acquire a
34df0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 0a   reference to a.
34e00 2a 2a 20 70 61 67 65 20 77 69 74 68 20 70 61 67  ** page with pag
34e10 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 49  e number pgno. I
34e20 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
34e30 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
34e40 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
34e50 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
34e60 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
34e70 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
34e80 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
34e90 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
34ea0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
34eb0 73 20 6f 66 20 74 68 65 20 67 65 74 74 65 72 20  s of the getter 
34ec0 6d 65 74 68 6f 64 20 64 65 70 65 6e 64 69 6e 67  method depending
34ed0 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65  .** on the curre
34ee0 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
34ef0 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  pager..**.**    
34f00 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 29   getPageNormal()
34f10 20 20 20 20 20 20 20 20 20 2d 2d 20 20 54 68 65           --  The
34f20 20 6e 6f 72 6d 61 6c 20 67 65 74 74 65 72 0a 2a   normal getter.*
34f30 2a 20 20 20 20 20 67 65 74 50 61 67 65 45 72 72  *     getPageErr
34f40 6f 72 28 29 20 20 20 20 20 20 20 20 20 20 2d 2d  or()          --
34f50 20 20 55 73 65 64 20 69 66 20 74 68 65 20 70 61    Used if the pa
34f60 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ger is in an err
34f70 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 20  or state.**     
34f80 67 65 74 50 61 67 65 4d 6d 61 70 28 29 20 20 20  getPageMmap()   
34f90 20 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64          --  Used
34fa0 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65   if memory-mappe
34fb0 64 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64  d I/O is enabled
34fc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
34fd0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
34fe0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
34ff0 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
35000 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
35010 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
35020 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
35030 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
35040 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
35050 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
35060 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
35070 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
35080 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
35090 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
350a0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
350b0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
350c0 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
350d0 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
350e0 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
350f0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
35100 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
35110 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
35120 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
35130 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
35140 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
35150 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
35160 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
35170 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
35180 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
35190 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
351a0 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
351b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
351c0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
351d0 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
351e0 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
351f0 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
35200 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
35210 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
35220 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
35230 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
35240 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
35250 70 61 67 65 20 6f 72 20 69 66 20 0a 2a 2a 20 74  page or if .** t
35260 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
35270 65 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  er contains the 
35280 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
35290 45 4e 54 20 62 69 74 20 61 6e 64 20 74 68 65 20  ENT bit and the 
352a0 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
352b0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
352c0 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
352d0 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
352e0 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
352f0 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
35300 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
35310 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
35320 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
35330 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
35340 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
35350 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
35360 54 45 4e 54 20 69 73 20 74 72 75 65 2c 20 69 74  TENT is true, it
35370 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
35380 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
35390 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
353a0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
353b0 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
353c0 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
353d0 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
353e0 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
353f0 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
35400 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
35410 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
35420 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
35430 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
35440 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
35450 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
35460 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
35470 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
35480 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
35490 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
354a0 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
354b0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
354c0 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f 4e  * If PAGER_GET_N
354d0 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75 65  OCONTENT is true
354e0 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
354f0 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
35500 65 64 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  ed instead.** of
35510 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
35520 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
35530 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
35540 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
35550 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
35560 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
35570 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
35580 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
35590 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
355a0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
355b0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
355c0 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
355d0 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
355e0 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
355f0 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
35600 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
35610 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
35620 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
35630 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
35640 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
35650 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
35660 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
35670 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
35680 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
35690 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
356a0 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
356b0 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
356c0 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
356d0 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
356e0 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
356f0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
35700 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
35710 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
35720 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
35730 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
35740 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
35750 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
35760 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
35770 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
35780 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
35790 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
357a0 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
357b0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
357c0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
357d0 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
357e0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
357f0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
35800 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
35810 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
35820 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
35830 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
35840 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
35850 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
35860 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
35870 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
35880 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
35890 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
358a0 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
358b0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
358c0 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
358d0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
358e0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
358f0 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les..*/.static i
35900 6e 74 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c  nt getPageNormal
35910 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
35920 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
35930 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
35940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
35950 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
35960 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
35970 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
35980 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
35990 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
359a0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
359b0 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
359c0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
359d0 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
359e0 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  ET_XXX flags */.
359f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35a00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72  LITE_OK;.  PgHdr
35a10 20 2a 70 50 67 3b 0a 20 20 75 38 20 6e 6f 43 6f   *pPg;.  u8 noCo
35a20 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  ntent;          
35a30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
35a40 20 69 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   if PAGER_GET_NO
35a50 43 4f 4e 54 45 4e 54 20 69 73 20 73 65 74 20 2a  CONTENT is set *
35a60 2f 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63  /.  sqlite3_pcac
35a70 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a  he_page *pBase;.
35a80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35a90 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
35aa0 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
35ab0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
35ac0 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
35ad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
35ae0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
35af0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
35b00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73  ert( pPager->has
35b10 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d  HeldSharedLock==
35b20 31 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  1 );..  if( pgno
35b30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
35b40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35b50 3b 0a 20 20 70 42 61 73 65 20 3d 20 73 71 6c 69  ;.  pBase = sqli
35b60 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
35b70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
35b80 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 69 66 28 20  pgno, 3);.  if( 
35b90 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pBase==0 ){.    
35ba0 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  pPg = 0;.    rc 
35bb0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
35bc0 65 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65  etchStress(pPage
35bd0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
35be0 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 69  , &pBase);.    i
35bf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35c00 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
35c10 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 69  quire_err;.    i
35c20 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20  f( pBase==0 ){. 
35c30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
35c40 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
35c50 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
35c60 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
35c70 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 2a 70 70  .  }.  pPg = *pp
35c80 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Page = sqlite3Pc
35c90 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28  acheFetchFinish(
35ca0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
35cb0 20 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20   pgno, pBase);. 
35cc0 20 61 73 73 65 72 74 28 20 70 50 67 3d 3d 28 2a   assert( pPg==(*
35cd0 70 70 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  ppPage) );.  ass
35ce0 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  ert( pPg->pgno==
35cf0 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
35d00 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
35d10 50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50  Pager || pPg->pP
35d20 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 6e 6f  ager==0 );..  no
35d30 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73  Content = (flags
35d40 20 26 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43   & PAGER_GET_NOC
35d50 4f 4e 54 45 4e 54 29 21 3d 30 3b 0a 20 20 69 66  ONTENT)!=0;.  if
35d60 28 20 70 50 67 2d 3e 70 50 61 67 65 72 20 26 26  ( pPg->pPager &&
35d70 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
35d80 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
35d90 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
35da0 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
35db0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
35dc0 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
35dd0 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
35de0 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
35df0 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
35e00 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
35e10 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
35e20 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
35e30 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50  Pager) );.    pP
35e40 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
35e50 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20  R_STAT_HIT]++;. 
35e60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35e70 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
35e80 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
35e90 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
35ea0 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
35eb0 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
35ec0 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
35ed0 69 74 69 61 6c 69 7a 65 64 2e 20 42 75 74 20 66  itialized. But f
35ee0 69 72 73 74 20 73 6f 6d 65 20 65 72 72 6f 72 20  irst some error 
35ef0 63 68 65 63 6b 73 3a 0a 20 20 20 20 2a 2a 0a 20  checks:.    **. 
35f00 20 20 20 2a 2a 20 28 31 29 20 54 68 65 20 6d 61     ** (1) The ma
35f10 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
35f20 72 20 69 73 20 32 5e 33 31 0a 20 20 20 20 2a 2a  r is 2^31.    **
35f30 20 28 32 29 20 4e 65 76 65 72 20 74 72 79 20 74   (2) Never try t
35f40 6f 20 66 65 74 63 68 20 74 68 65 20 6c 6f 63 6b  o fetch the lock
35f50 69 6e 67 20 70 61 67 65 0a 20 20 20 20 2a 2f 0a  ing page.    */.
35f60 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47      if( pgno>PAG
35f70 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
35f80 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
35f90 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
35fa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
35fb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
35fc0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
35fd0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
35fe0 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  }..    pPg->pPag
35ff0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
36000 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
36010 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
36020 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 69   !MEMDB );.    i
36030 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
36040 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
36050 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c  ->dbSize<pgno ||
36060 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
36070 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
36080 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
36090 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
360a0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
360b0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
360c0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
360d0 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
360e0 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
360f0 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
36100 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
36110 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
36120 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
36130 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
36140 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
36150 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
36160 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
36170 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
36180 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
36190 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
361a0 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
361b0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
361c0 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
361d0 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
361e0 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
361f0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
36200 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
36210 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
36220 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
36230 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
36240 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
36250 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
36260 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
36270 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
36280 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
36290 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
362a0 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
362b0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
362c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
362d0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
362e0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
362f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
36300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36310 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
36320 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
36330 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
36340 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
36350 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
36360 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
36370 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
36380 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
36390 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
363a0 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
363b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
363c0 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
363d0 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
363e0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
363f0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
36400 20 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20       u32 iFrame 
36410 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
36420 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f       /* Frame to
36430 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66   read from WAL f
36440 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ile */.      if(
36450 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
36460 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
36470 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
36480 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
36490 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
364a0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  rame);.        i
364b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
364c0 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
364d0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
364e0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
364f0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
36500 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
36510 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
36520 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
36530 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
36540 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d  bPage(pPg, iFram
36550 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
36560 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36570 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
36580 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
36590 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
365a0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
365b0 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ash(pPg);.  }.  
365c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
365d0 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65  ;..pager_acquire
365e0 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20  _err:.  assert( 
365f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
36600 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
36610 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
36620 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rop(pPg);.  }.  
36630 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
36640 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2a  sed(pPager);.  *
36650 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
36660 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
36670 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
36680 53 49 5a 45 3e 30 0a 2f 2a 20 54 68 65 20 70 61  SIZE>0./* The pa
36690 67 65 20 67 65 74 74 65 72 20 66 6f 72 20 77 68  ge getter for wh
366a0 65 6e 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64  en memory-mapped
366b0 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64 20   I/O is enabled 
366c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
366d0 74 50 61 67 65 4d 4d 61 70 28 0a 20 20 50 61 67  tPageMMap(.  Pag
366e0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
366f0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
36700 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
36710 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
36720 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
36730 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
36740 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
36750 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
36760 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
36770 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
36780 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
36790 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
367a0 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
367b0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
367c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
367d0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ;.  PgHdr *pPg =
367e0 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65   0;.  u32 iFrame
367f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
36800 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74        /* Frame t
36810 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20  o read from WAL 
36820 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74  file */..  /* It
36830 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74   is acceptable t
36840 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c  o use a read-onl
36850 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f  y (mmap) page fo
36860 72 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70  r any page excep
36870 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66  t.  ** page 1 if
36880 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69   there is no wri
36890 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
368a0 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49  pen or the ACQUI
368b0 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  RE_READONLY.  **
368c0 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66   flag was specif
368d0 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
368e0 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61  r. And so long a
368f0 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20  s the db is not 
36900 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
36910 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y or in-memory d
36920 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
36930 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b  onst int bMmapOk
36940 20 3d 20 28 70 67 6e 6f 3e 31 0a 20 20 20 26 26   = (pgno>1.   &&
36950 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
36960 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c  ==PAGER_READER |
36970 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  | (flags & PAGER
36980 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a  _GET_READONLY)).
36990 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
369a0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
369b0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
369c0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 61 73  E_HAS_CODEC.  as
369d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 78 43  sert( pPager->xC
369e0 6f 64 65 63 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  odec==0 );.#endi
369f0 66 0a 0a 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61  f..  /* Optimiza
36a00 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69  tion note:  Addi
36a10 6e 67 20 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22  ng the "pgno<=1"
36a20 20 74 65 72 6d 20 62 65 66 6f 72 65 20 22 70 67   term before "pg
36a30 6e 6f 3d 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a  no==0" here.  **
36a40 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70   allows the comp
36a50 69 6c 65 72 20 6f 70 74 69 6d 69 7a 65 72 20 74  iler optimizer t
36a60 6f 20 72 65 75 73 65 20 74 68 65 20 72 65 73 75  o reuse the resu
36a70 6c 74 73 20 6f 66 20 74 68 65 20 22 70 67 6e 6f  lts of the "pgno
36a80 3e 31 22 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e  >1".  ** test in
36a90 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 74   the previous st
36aa0 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f  atement, and avo
36ab0 69 64 20 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d  id testing pgno=
36ac0 3d 30 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63  =0 in the.  ** c
36ad0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
36ae0 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20   pgno is large. 
36af0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31  */.  if( pgno<=1
36b00 20 26 26 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20   && pgno==0 ){. 
36b10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36b20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
36b30 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
36b40 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
36b50 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
36b60 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
36b70 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
36b80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36b90 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
36ba0 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  aredLock==1 );. 
36bb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36bc0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
36bd0 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 62 4d  _OK );..  if( bM
36be0 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73  mapOk && pagerUs
36bf0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
36c00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36c10 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
36c20 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
36c30 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 69   &iFrame);.    i
36c40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36c50 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67   ){.      *ppPag
36c60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
36c70 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
36c80 7d 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20  }.  if( bMmapOk 
36c90 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a  && iFrame==0 ){.
36ca0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
36cb0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
36cc0 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61  lite3OsFetch(pPa
36cd0 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20  ger->fd, .      
36ce0 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20    (i64)(pgno-1) 
36cf0 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
36d00 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ze, pPager->page
36d10 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20  Size, &pData.   
36d20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
36d30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61  SQLITE_OK && pDa
36d40 74 61 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ta ){.      if( 
36d50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
36d60 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 70  AGER_READER || p
36d70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
36d80 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d  ){.        pPg =
36d90 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
36da0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
36db0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
36dc0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
36dd0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
36de0 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
36df0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44  pPager, pgno, pD
36e00 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ata, &pPg);.    
36e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36e20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
36e30 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
36e40 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  4)(pgno-1)*pPage
36e50 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
36e60 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
36e70 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
36e80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
36e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
36ea0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
36eb0 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72 65   pPg;.        re
36ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
36ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36ee0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36ef0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  _OK ){.      *pp
36f00 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
36f10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
36f20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 65  .  }.  return ge
36f30 74 50 61 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67  tPageNormal(pPag
36f40 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  er, pgno, ppPage
36f50 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64  , flags);.}.#end
36f60 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
36f70 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
36f80 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74  ./* The page get
36f90 74 65 72 20 6d 65 74 68 6f 64 20 66 6f 72 20 77  ter method for w
36fa0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
36fb0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
36fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
36fd0 74 50 61 67 65 45 72 72 6f 72 28 0a 20 20 50 61  tPageError(.  Pa
36fe0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
36ff0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
37000 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
37010 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
37020 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
37030 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
37040 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
37050 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
37060 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
37070 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
37080 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
37090 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
370a0 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58  /* PAGER_GET_XXX
370b0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55   flags */.){.  U
370c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
370d0 70 67 6e 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pgno);.  UNUSED_
370e0 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29  PARAMETER(flags)
370f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37100 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
37110 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50  ITE_OK );.  *ppP
37120 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
37130 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
37140 65 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74  e;.}.../* Dispat
37150 63 68 20 61 6c 6c 20 70 61 67 65 20 66 65 74 63  ch all page fetc
37160 68 20 72 65 71 75 65 73 74 73 20 74 6f 20 74 68  h requests to th
37170 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 67 65  e appropriate ge
37180 74 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  tter method..*/.
37190 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
371a0 47 65 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Get(.  Pager *pP
371b0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
371c0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
371d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
371e0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
371f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
37200 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
37210 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
37220 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
37230 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
37240 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
37250 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
37260 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
37270 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
37280 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
37290 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49  ITE_SERVER_EDITI
372a0 4f 4e 0a 20 20 69 66 28 20 70 61 67 65 72 49 73  ON.  if( pagerIs
372b0 53 65 72 76 65 72 28 70 50 61 67 65 72 29 20 29  Server(pPager) )
372c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
372d0 71 6c 69 74 65 33 53 65 72 76 65 72 4c 6f 63 6b  qlite3ServerLock
372e0 28 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72  (pPager->pServer
372f0 2c 20 70 67 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20  , pgno, 0, 0);. 
37300 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37310 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
37320 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
37330 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 78 47  eturn pPager->xG
37340 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
37350 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b   ppPage, flags);
37360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
37370 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
37380 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
37390 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
373a0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
373b0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
373c0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
373d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
373e0 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
373f0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
37400 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a  in cache. .**.**
37410 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
37420 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
37430 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
37440 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
37450 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
37460 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
37470 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
37480 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
37490 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
374a0 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
374b0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
374c0 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
374d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
374e0 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
374f0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
37500 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
37510 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
37520 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
37530 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
37540 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
37550 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
37560 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71  Pgno pgno){.  sq
37570 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67  lite3_pcache_pag
37580 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
37590 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
375a0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
375b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
375c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21  pPager->pPCache!
375d0 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
375e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
375f0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
37600 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  he, pgno, 0);.  
37610 61 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30  assert( pPage==0
37620 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 48   || pPager->hasH
37630 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b  eldSharedLock );
37640 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
37650 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
37660 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
37670 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50  heFetchFinish(pP
37680 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
37690 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a  gno, pPage);.}..
376a0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
376b0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
376c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
376d0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
376e0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
376f0 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
37700 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
37710 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
37720 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
37730 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
37740 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
37750 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
37760 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
37770 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
37780 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
37790 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
377a0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
377b0 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20  fNotNull(DbPage 
377c0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
377d0 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
377e0 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50  ( pPg!=0 );.  pP
377f0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
37800 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66  er;.  if( pPg->f
37810 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41  lags & PGHDR_MMA
37820 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65  P ){.    pagerRe
37830 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67  leaseMapPage(pPg
37840 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
37850 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
37860 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
37870 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
37880 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a  used(pPager);.}.
37890 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
378a0 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
378b0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
378c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
378d0 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
378e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
378f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
37900 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
37910 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
37920 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
37930 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
37940 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
37950 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
37960 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
37970 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
37980 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
37990 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
379a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
379b0 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
379c0 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
379d0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
379e0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
379f0 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
37a00 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
37a10 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
37a20 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
37a30 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
37a40 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
37a50 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
37a60 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
37a70 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
37a80 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
37a90 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
37aa0 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
37ab0 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
37ac0 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
37ad0 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
37ae0 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
37af0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
37b00 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
37b10 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
37b20 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
37b30 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
37b40 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
37b50 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
37b60 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
37b70 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
37b80 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
37b90 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
37ba0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
37bb0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
37bc0 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
37bd0 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
37be0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
37bf0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
37c00 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
37c10 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
37c20 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
37c30 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
37c40 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
37c50 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
37c60 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
37c70 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
37c80 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
37c90 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
37ca0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
37cb0 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
37cc0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
37cd0 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
37ce0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
37cf0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
37d00 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
37d10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
37d20 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
37d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37d40 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
37d50 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
37d60 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
37d70 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
37d80 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
37d90 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
37da0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
37db0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37dc0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
37dd0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
37de0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37df0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
37e00 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37e10 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
37e20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
37e30 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
37e40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
37e50 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
37e60 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
37e70 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
37e80 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
37e90 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
37ea0 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
37eb0 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
37ec0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
37ed0 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
37ee0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
37ef0 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70  rCode;..  if( !p
37f00 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
37f10 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  r) && pPager->jo
37f20 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
37f30 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
37f40 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
37f50 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
37f60 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
37f70 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
37f80 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
37f90 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
37fa0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
37fb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
37fc0 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  T;.    }.  .    
37fd0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
37fe0 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
37ff0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
38000 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  en. */.    if( !
38010 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
38020 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
38030 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
38040 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
38050 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
38060 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
38070 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
38080 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
38090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
380a0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53     int flags = S
380b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
380c0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
380d0 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 20  _CREATE;.       
380e0 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20 20   int nSpill;..  
380f0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
38100 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
38110 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
38120 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
38130 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
38140 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
38150 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  RNAL);.         
38160 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65   nSpill = sqlite
38170 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69  3Config.nStmtSpi
38180 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ll;.        }els
38190 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  e{.          fla
381a0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
381b0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
381c0 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c            nSpill
381d0 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a   = jrnlBufferSiz
381e0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
381f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a     }.          .
38200 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
38210 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  y that the datab
38220 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68  ase still has th
38230 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69  e same name as i
38240 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20  t did when.     
38250 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69     ** it was ori
38260 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20  ginally opened. 
38270 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
38280 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
38290 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  d(pPager);.     
382a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
382b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
382c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
382d0 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20 20 20 20  urnalOpen (.    
382e0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
382f0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
38300 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
38310 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a 20 20 20  lags, nSpill.   
38320 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
38330 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
38340 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
38350 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
38360 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
38370 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20  ;.    }.  .  .  
38380 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
38390 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
383a0 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
383b0 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
383c0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
383d0 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
383e0 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
383f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
38400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
38410 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
38420 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
38430 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
38440 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
38450 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
38460 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
38470 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
38480 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
38490 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
384a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
384b0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
384c0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
384d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
384e0 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
384f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
38500 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
38510 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
38520 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
38530 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
38540 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
38550 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
38560 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
38570 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
38580 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
38590 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
385a0 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d  ER_CACHEMOD;.  }
385b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
385c0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
385d0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
385e0 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
385f0 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
38600 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
38610 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
38620 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
38630 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
38640 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
38650 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
38660 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
38670 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
38680 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
38690 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
386a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
386b0 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
386c0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
386d0 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
386e0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
386f0 63 6b 2e 20 49