/ Hex Artifact Content
Login

Artifact 9c2006fb3c4d4a985e79de21cb5e5be22c8ae663159cbd0bf5e708803bf53678:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 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 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ges */.  int (*x
8460: 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67 6e 6f  Get)(Pager*,Pgno
8470: 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 20  ,DbPage**,int); 
8480: 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 66 65  /* Routine to fe
8490: 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f 0a 23  tch a patch */.#
84a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
84b0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
84c0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
84d0: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
84e0: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
84f0: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
8500: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
8510: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
8520: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
8530: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
8540: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
8550: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
8560: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
8570: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
8580: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
8590: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
85a0: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
85b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
85c0: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
85d0: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
85e0: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
85f0: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
8600: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
8610: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
8620: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
8630: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
8640: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
8650: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
8660: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
8670: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
8680: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
8690: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
86a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
86b0: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
86c0: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
86d0: 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61  de=wal" */.  cha
86e0: 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
86f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
8700: 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d   name for write-
8710: 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e  ahead log */.#en
8720: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
8730: 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e  E_SERVER_EDITION
8740: 0a 20 20 53 65 72 76 65 72 20 2a 70 53 65 72 76  .  Server *pServ
8750: 65 72 3b 0a 20 20 53 65 72 76 65 72 50 61 67 65  er;.  ServerPage
8760: 20 2a 70 53 65 72 76 65 72 50 61 67 65 3b 0a 23   *pServerPage;.#
8770: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
8780: 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20  Indexes for use 
8790: 77 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74  with Pager.aStat
87a0: 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53  []. The Pager.aS
87b0: 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  tat[] array cont
87c0: 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ains.** the valu
87d0: 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70  es accessed by p
87e0: 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42  assing SQLITE_DB
87f0: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54  STATUS_CACHE_HIT
8800: 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a  , CACHE_MISS .**
8810: 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20   or CACHE_WRITE 
8820: 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  to sqlite3_db_st
8830: 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  atus()..*/.#defi
8840: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49  ne PAGER_STAT_HI
8850: 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41  T   0.#define PA
8860: 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31  GER_STAT_MISS  1
8870: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8880: 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a  TAT_WRITE 2../*.
8890: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
88a0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
88b0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
88c0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
88d0: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
88e0: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
88f0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8900: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8910: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8920: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8930: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8940: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8950: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8960: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8970: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8980: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8990: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
89a0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
89b0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
89c0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
89d0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
89e0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
89f0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8a00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8a10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8a20: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8a30: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8a40: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8a50: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8a60: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8a70: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8a80: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8a90: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8aa0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8ab0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8ac0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8ad0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8ae0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8af0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8b00: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8b10: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8b20: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8b30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8b40: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8b50: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8b60: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8b70: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8b80: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8b90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8ba0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8bb0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8bc0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8bd0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8be0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8bf0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8c00: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8c10: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8c20: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8c40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8c50: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8c60: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8c70: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8c80: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8c90: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ca0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8cb0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8cc0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8cd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8ce0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8cf0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8d00: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8d10: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8d20: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8d30: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8d40: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8d50: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8d60: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8d70: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8d80: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8d90: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8da0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
8db0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
8dc0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
8dd0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
8de0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
8df0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8e00: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
8e10: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
8e20: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
8e30: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
8e40: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
8e50: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
8e60: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
8e70: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
8e80: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
8e90: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
8ea0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
8eb0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
8ec0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
8ed0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
8ee0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
8ef0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
8f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
8f10: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
8f20: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
8f30: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
8f40: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
8f50: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
8f60: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
8f70: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
8f80: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
8f90: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
8fa0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
8fb0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
8fc0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
8fd0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
8fe0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
8ff0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9000: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9010: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9020: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9030: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9040: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
9050: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
9060: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
9070: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
9080: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
9090: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
90a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
90b0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
90c0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
90d0: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
90e0: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
90f0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9100: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9110: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9120: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9130: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9140: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
9150: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
9160: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
9170: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
9180: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
9190: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
91a0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
91b0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
91c0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
91d0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
91e0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
91f0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9200: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9210: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9220: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9230: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9240: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
9250: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
9260: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
9270: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
9280: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
9290: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
92a0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
92b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
92c0: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
92d0: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
92e0: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
92f0: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9300: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9310: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9320: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9330: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9340: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
9350: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
9360: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
9370: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
9380: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
9390: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
93a0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
93b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
93c0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
93d0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
93e0: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
93f0: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9400: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9410: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9420: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9430: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9440: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
9450: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
9460: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
9470: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
9480: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
9490: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
94a0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
94b0: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
94c0: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
94d0: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
94e0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
94f0: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9500: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9510: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9520: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9530: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9540: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
9550: 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20  hods!=0)../*.** 
9560: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
9570: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
9580: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
9590: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
95a0: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
95b0: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
95c0: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
95d0: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
95e0: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
95f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9600: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
9610: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9620: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9630: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9640: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
9650: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
9660: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
9670: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
9680: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
9690: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
96a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
96b0: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
96c0: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
96d0: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
96e0: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
96f0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9700: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
9710: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9720: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9730: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9740: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
9750: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
9760: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
9770: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
9780: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
9790: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
97a0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
97b0: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
97c0: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
97d0: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
97e0: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
97f0: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  _OK.#endif..#ifd
9800: 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52  ef SQLITE_SERVER
9810: 5f 45 44 49 54 49 4f 4e 0a 23 20 64 65 66 69 6e  _EDITION.# defin
9820: 65 20 70 61 67 65 72 49 73 53 65 72 76 65 72 28  e pagerIsServer(
9830: 78 29 20 28 28 78 29 2d 3e 70 53 65 72 76 65 72  x) ((x)->pServer
9840: 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  !=0).#else.# def
9850: 69 6e 65 20 70 61 67 65 72 49 73 53 65 72 76 65  ine pagerIsServe
9860: 72 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  r(x) 0.#endif..#
9870: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
9880: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
9890: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
98a0: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
98b0: 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  Pager) );.**.** 
98c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75  This function ru
98d0: 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20  ns many asserts 
98e0: 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69  to try to find i
98f0: 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69  nconsistencies i
9900: 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61  n.** the interna
9910: 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  l state of the P
9920: 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ager object..*/.
9930: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
9940: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
9950: 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72  ger *p){.  Pager
9960: 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20   *pPager = p;.. 
9970: 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62   /* State must b
9980: 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73  e valid. */.  as
9990: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d  sert( p->eState=
99a0: 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20  =PAGER_OPEN.    
99b0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
99c0: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20  =PAGER_READER.  
99d0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
99e0: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
99f0: 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
9a00: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9a10: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
9a20: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9a30: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9a40: 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
9a50: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9a60: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
9a70: 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  SHED.       || p
9a80: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9a90: 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ERROR.  );..  /*
9aa0: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
9ab0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
9ac0: 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f  , a temp-file co
9ad0: 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  nnection always 
9ae0: 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20  behaves.  ** as 
9af0: 69 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63  if it has an exc
9b00: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
9b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9b20: 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74  . It never updat
9b30: 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e  es.  ** the chan
9b40: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
9b50: 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43  , so the changeC
9b60: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
9b70: 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a   always set..  *
9b80: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  /.  assert( p->t
9b90: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d  empFile==0 || p-
9ba0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
9bb0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
9bc0: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9bd0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68  =0 || pPager->ch
9be0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b  angeCountDone );
9bf0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
9c00: 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  eJournal flag is
9c10: 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72   clear, the jour
9c20: 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65  nal-mode must be
9c30: 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e   "OFF". .  ** An
9c40: 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d if the journal
9c50: 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20  -mode is "OFF", 
9c60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9c70: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65   must not be ope
9c80: 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
9c90: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9ca0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9cb0: 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73  ODE_OFF || p->us
9cc0: 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
9cd0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9ce0: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
9cf0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21  NALMODE_OFF || !
9d00: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29  isOpen(p->jfd) )
9d10: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
9d20: 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73  at MEMDB implies
9d30: 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20   noSync. And an 
9d40: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9d50: 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74  l. Since .  ** t
9d60: 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d  his means an in-
9d70: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72  memory pager per
9d80: 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61  forms no IO at a
9d90: 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e  ll, it cannot en
9da0: 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69  counter .  ** ei
9db0: 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
9dc0: 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  R or SQLITE_FULL
9dd0: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
9de0: 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69   or while finali
9df0: 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75  zing .  ** a jou
9e00: 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68  rnal file. (alth
9e10: 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  ough the in-memo
9e20: 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65  ry journal imple
9e30: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20  mentation may . 
9e40: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
9e50: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68  E_IOERR_NOMEM wh
9e60: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
9e70: 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72  file is being wr
9e80: 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a  itten). It .  **
9e90: 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f   is therefore no
9ea0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
9eb0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
9ec0: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
9ed0: 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65  RROR .  ** state
9ee0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ..  */.  if( MEM
9ef0: 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
9f00: 28 20 21 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29  ( !isOpen(p->fd)
9f10: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9f20: 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20  p->noSync );.   
9f30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
9f40: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9f50: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
9f60: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
9f70: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9f80: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
9f90: 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20  MORY .    );.   
9fa0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61   assert( p->eSta
9fb0: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
9fc0: 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  && p->eState!=PA
9fd0: 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
9fe0: 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
9ff0: 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d  Wal(p)==0 );.  }
a000: 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65  ..  /* If change
a010: 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74  CountDone is set
a020: 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  , a RESERVED loc
a030: 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
a040: 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f  t be held.  ** o
a050: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  n the file..  */
a060: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a070: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
a080: 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ne==0 || pPager-
a090: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a0a0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
a0b0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e  t( p->eLock!=PEN
a0c0: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  DING_LOCK );..  
a0d0: 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74  switch( p->eStat
a0e0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41  e ){.    case PA
a0f0: 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20  GER_OPEN:.      
a100: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
a110: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a120: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a130: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a140: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a150: 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
a160: 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
a170: 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  e)==0 || pPager-
a180: 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
a190: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a1a0: 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45 52  ase PAGER_READER
a1b0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a1c0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a1d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a1e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a1f0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a200: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a210: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  rt( p->eLock>=SH
a220: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
a230: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a240: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
a250: 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61  _LOCKED:.      a
a260: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a270: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
a280: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a290: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a2a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a2b0: 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65     if( !pagerUse
a2c0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
a2d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a2e0: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
a2f0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a300: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
a310: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
a320: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a330: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
a340: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a350: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a360: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a370: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a380: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a390: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a3a0: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
a3b0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
a3c0: 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  aster==0 );.    
a3d0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a3e0: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a3f0: 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20  CACHEMOD:.      
a400: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a410: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
a420: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a430: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a450: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
a460: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
a470: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73          /* It is
a480: 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69   possible that i
a490: 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77  f journal_mode=w
a4a0: 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65 69  al here that nei
a4b0: 74 68 65 72 20 74 68 65 0a 20 20 20 20 20 20 20  ther the.       
a4c0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
a4d0: 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c   nor the WAL fil
a4e0: 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73  e are open. This
a4f0: 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a   happens during.
a500: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c          ** a rol
a510: 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f  lback transactio
a520: 6e 20 74 68 61 74 20 73 77 69 74 63 68 65 73 20  n that switches 
a530: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  from journal_mod
a540: 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a  e=off.        **
a550: 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   to journal_mode
a560: 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  =wal..        */
a570: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a580: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
a590: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
a5a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a5b0: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a5c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a5d0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a5e0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a5f0: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  F .             
a600: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a610: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a620: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a630: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
a640: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a650: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
a660: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
a670: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
a680: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a690: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
a6a0: 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  bHintSize );.   
a6b0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a6c0: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
a6d0: 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73  _DBMOD:.      as
a6e0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  sert( p->eLock==
a6f0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a700: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a710: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a720: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a730: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
a740: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a750: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a760: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c  ( p->eLock>=EXCL
a770: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a780: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a790: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a7a0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a7b0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a7c0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a7e0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a7f0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a800: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a810: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a820: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c  ger->dbOrigSize<
a830: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
a840: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ize );.      bre
a850: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a860: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
a870: 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  HED:.      asser
a880: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a890: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a8a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a8b0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a8c0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a8d0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a8e0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a8f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a900: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20  sOpen(p->jfd) . 
a910: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a920: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a930: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
a940: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  FF .           |
a950: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a960: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a970: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
a980: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a990: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45      case PAGER_E
a9a0: 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54  RROR:.      /* T
a9b0: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
a9c0: 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
a9d0: 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20  nding reference 
a9e0: 74 6f 20 74 68 65 20 70 61 67 65 72 20 69 66 0a  to the pager if.
a9f0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f        ** in ERRO
aa00: 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  R state. Otherwi
aa10: 73 65 20 74 68 65 20 70 61 67 65 72 20 73 68 6f  se the pager sho
aa20: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
aa30: 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a   dropped.      *
aa40: 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  * back to OPEN s
aa50: 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
aa60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
aa70: 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
aa80: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
aa90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
aaa0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
aab0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
aac0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
aad0: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
aae0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
aaf0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
ab00: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
ab10: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
ab20: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
ab30: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
ab40: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
ab50: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
ab60: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
ab70: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
ab80: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
ab90: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
aba0: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
abb0: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
abc0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
abd0: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
abe0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
abf0: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
ac00: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
ac10: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
ac20: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
ac30: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
ac40: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
ac50: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
ac60: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
ac70: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
ac80: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
ac90: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
aca0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
acb0: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
acc0: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
acd0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
ace0: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
acf0: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
ad00: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
ad10: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
ad20: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
ad30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
ad40: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
ad50: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
ad60: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
ad70: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
ad80: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
ad90: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
ada0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
adb0: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
adc0: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
add0: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
ade0: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
adf0: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
ae00: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
ae10: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
ae20: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
ae30: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
ae40: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
ae50: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
ae60: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
ae70: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ae80: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
ae90: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
aea0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aeb0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
aec0: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
aed0: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
aee0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
aef0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
af00: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
af10: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
af20: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
af30: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
af40: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
af50: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
af60: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
af70: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
af80: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
af90: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
afa0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
afb0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
afc0: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
afd0: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
afe0: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
aff0: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
b000: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
b010: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
b020: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
b030: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
b040: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
b050: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
b060: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
b070: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
b080: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b090: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
b0a0: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
b0b0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b0c0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
b0d0: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
b0e0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b0f0: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
b100: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
b110: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
b120: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
b130: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b140: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
b150: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
b160: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b170: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b180: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
b190: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
b1a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b1c0: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
b1d0: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
b1e0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1f0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b200: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
b210: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
b220: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b230: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b240: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
b250: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
b260: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b270: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b280: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
b290: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
b2a0: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b2b0: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
b2c0: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
b2d0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
b2e0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
b2f0: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
b300: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
b310: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
b320: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
b330: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
b340: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
b350: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
b360: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
b370: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 76 61 72  ences to the var
b380: 69 6f 75 73 20 70 61 67 65 20 67 65 74 74 65 72  ious page getter
b390: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
b3a0: 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61  getPageNormal(Pa
b3b0: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b3c0: 2a 2a 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  **,int);.static 
b3d0: 69 6e 74 20 67 65 74 50 61 67 65 45 72 72 6f 72  int getPageError
b3e0: 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50  (Pager*,Pgno,DbP
b3f0: 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20  age**,int);.#if 
b400: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
b410: 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e  SIZE>0.static in
b420: 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28 50 61  t getPageMMap(Pa
b430: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b440: 2a 2a 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  **,int);.#endif.
b450: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50  ./*.** Set the P
b460: 61 67 65 72 2e 78 47 65 74 20 6d 65 74 68 6f 64  ager.xGet method
b470: 20 66 6f 72 20 74 68 65 20 61 70 70 72 6f 70 72   for the appropr
b480: 69 61 74 65 20 72 6f 75 74 69 6e 65 20 75 73 65  iate routine use
b490: 64 20 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f  d to fetch.** co
b4a0: 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  ntent from the p
b4b0: 61 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ager..*/.static 
b4c0: 76 6f 69 64 20 73 65 74 47 65 74 74 65 72 4d 65  void setGetterMe
b4d0: 74 68 6f 64 28 50 61 67 65 72 20 2a 70 50 61 67  thod(Pager *pPag
b4e0: 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
b4f0: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
b500: 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d    pPager->xGet =
b510: 20 67 65 74 50 61 67 65 45 72 72 6f 72 3b 0a 23   getPageError;.#
b520: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
b530: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73  AP_SIZE>0.  }els
b540: 65 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70  e if( USEFETCH(p
b550: 50 61 67 65 72 29 0a 23 69 66 64 65 66 20 53 51  Pager).#ifdef SQ
b560: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
b570: 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f    && pPager->xCo
b580: 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  dec==0.#endif.  
b590: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
b5a0: 47 65 74 20 3d 20 67 65 74 50 61 67 65 4d 4d 61  Get = getPageMMa
b5b0: 70 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  p;.#endif /* SQL
b5c0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
b5d0: 45 3e 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  E>0 */.  }else{.
b5e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b5f0: 20 3d 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c   = getPageNormal
b600: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
b610: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
b620: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
b630: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
b640: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b650: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
b660: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
b670: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
b680: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
b690: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
b6a0: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
b6b0: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
b6c0: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
b6d0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b6e0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
b6f0: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
b700: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
b710: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
b720: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b730: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
b740: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
b750: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
b760: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b770: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b780: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b790: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b7a0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b7b0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b7c0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
b7d0: 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  p;.  Pgno pgno =
b7e0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e   pPg->pgno;.  in
b7f0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b800: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b810: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
b820: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
b830: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
b840: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
b850: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
b860: 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
b870: 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  l(p->pInSavepoin
b880: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b890: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b8a0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b8b0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
b8c0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
b8d0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b8e0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b8f0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b900: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b910: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b920: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b930: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b940: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b950: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b960: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b970: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64  g->pgno);.}.#end
b980: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
b990: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b9a0: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
b9b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b9c0: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
b9d0: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
b9e0: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
b9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
ba00: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
ba10: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
ba20: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
ba30: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
ba40: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
ba50: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
ba60: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
ba70: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
ba80: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
ba90: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
baa0: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
bab0: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
bac0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
bad0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
bae0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
baf0: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
bb00: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
bb10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bb20: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
bb30: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
bb40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bb50: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
bb60: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
bb70: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
bb80: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
bb90: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
bba0: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
bbb0: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
bbc0: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
bbd0: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  ).../*.** Write 
bbe0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
bbf0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
bc00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
bc10: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
bc20: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
bc30: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
bc40: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
bc50: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
bc60: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
bc70: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
bc80: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
bc90: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
bca0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
bcb0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
bcc0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
bcd0: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
bce0: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
bcf0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
bd00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
bd10: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
bd20: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
bd30: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f  her NO_LOCK.** o
bd40: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52  r SHARED_LOCK. R
bd50: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
bd60: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bd70: 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28  call to xUnlock(
bd80: 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73  ).** succeeds, s
bd90: 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f  et the Pager.eLo
bda0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d  ck variable to m
bdb0: 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70  atch the (attemp
bdc0: 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a  ted) new lock..*
bdd0: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
bde0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
bdf0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
be00: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
be10: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
be20: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
be30: 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f  y it. See the co
be40: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
be50: 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55  #define of .** U
be60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
be70: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
be80: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
be90: 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63  c int pagerUnloc
bea0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
beb0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
bec0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
bed0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
bee0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
bef0: 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
bf00: 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29  ->eLock==eLock )
bf10: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
bf20: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  k==NO_LOCK || eL
bf30: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
bf40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
bf50: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
bf60: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
bf70: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
bf80: 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  rt( eLock!=NO_LO
bf90: 43 4b 20 7c 7c 20 70 61 67 65 72 49 73 53 65 72  CK || pagerIsSer
bfa0: 76 65 72 28 70 50 61 67 65 72 29 3d 3d 30 20 29  ver(pPager)==0 )
bfb0: 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ;.  if( isOpen(p
bfc0: 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
bfd0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
bfe0: 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29  ->eLock>=eLock )
bff0: 3b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  ;.    rc = pPage
c000: 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49  r->noLock ? SQLI
c010: 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f  TE_OK : sqlite3O
c020: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
c030: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
c040: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
c050: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
c060: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
c070: 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f  >eLock = (u8)eLo
c080: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  ck;.    }.    IO
c090: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25  TRACE(("UNLOCK %
c0a0: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
c0b0: 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72   eLock)).  }.  r
c0c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c0d0: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61  ** Lock the data
c0e0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
c0f0: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
c100: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
c110: 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52  HARED_LOCK,.** R
c120: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
c130: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20  EXCLUSIVE_LOCK. 
c140: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
c150: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
c160: 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c   the.** Pager.eL
c170: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
c180: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
c190: 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78  state. .**.** Ex
c1a0: 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65  cept, if Pager.e
c1b0: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
c1c0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e  NKNOWN_LOCK when
c1d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c1e0: 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f  s .** called, do
c1f0: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75   not modify it u
c200: 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f  nless the new lo
c210: 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45  cking state is E
c220: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a  XCLUSIVE_LOCK. .
c230: 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  ** See the comme
c240: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
c250: 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f  fine of UNKNOWN_
c260: 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
c270: 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74  anation .** of t
c280: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c290: 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50  nt pagerLockDb(P
c2a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
c2b0: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
c2c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c2d0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c2e0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
c2f0: 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44   eLock==RESERVED
c300: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
c310: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
c320: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
c330: 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70  eLock<eLock || p
c340: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
c350: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20  KNOWN_LOCK ){.  
c360: 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e    rc = pPager->n
c370: 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f  oLock ? SQLITE_O
c380: 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  K : sqlite3OsLoc
c390: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
c3a0: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ock);.    if( rc
c3b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
c3c0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55  pPager->eLock!=U
c3d0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f  NKNOWN_LOCK||eLo
c3e0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
c3f0: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  CK) ){.      pPa
c400: 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38  ger->eLock = (u8
c410: 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f  )eLock;.      IO
c420: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
c430: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65  %d\n", pPager, e
c440: 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d  Lock)).    }.  }
c450: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c460: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c470: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
c480: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
c490: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
c4a0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
c4b0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
c4c0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
c4d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
c4e0: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
c4f0: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
c500: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
c510: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
c520: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
c530: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
c540: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
c550: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
c560: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
c570: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
c580: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
c590: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
c5a0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
c5b0: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
c5c0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
c5d0: 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  * The optimizati
c5e0: 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79  on is also alway
c5f0: 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65  s enabled for te
c600: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49  mporary files. I
c610: 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  t is.** an error
c620: 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
c630: 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72  nction if pPager
c640: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e   is opened on an
c650: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
c660: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
c670: 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
c680: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  n cannot be used
c690: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
c6a0: 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73   If it can be us
c6b0: 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ed,.** then the 
c6c0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
c6d0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
c6e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
c6f0: 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69  hen it.** contai
c700: 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61  ns rollback data
c710: 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65   for exactly one
c720: 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   page..*/.#ifdef
c730: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
c740: 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74  TOMIC_WRITE.stat
c750: 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65  ic int jrnlBuffe
c760: 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
c770: 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
c780: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
c790: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
c7a0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b  e ){.    int dc;
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
c7d0: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
c7e0: 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tics */.    int 
c7f0: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20  nSector;        
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c810: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
c820: 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20      int szPage; 
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69        /* Page si
c850: 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ze */..    asser
c860: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
c870: 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20  ->fd) );.    dc 
c880: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
c890: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
c8a0: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
c8b0: 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67    nSector = pPag
c8c0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
c8d0: 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61      szPage = pPa
c8e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a  ger->pageSize;..
c8f0: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
c900: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
c910: 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
c920: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
c930: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
c940: 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
c950: 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51    if( 0==(dc&(SQ
c960: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
c970: 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c  C|(szPage>>8)) |
c980: 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65  | nSector>szPage
c990: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
c9a0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 0;.    }.  }..
c9b0: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
c9c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
c9d0: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
c9e0: 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6c 73 65  pPager);.}.#else
c9f0: 0a 23 20 64 65 66 69 6e 65 20 6a 72 6e 6c 42 75  .# define jrnlBu
ca00: 66 66 65 72 53 69 7a 65 28 78 29 20 30 0a 23 65  fferSize(x) 0.#e
ca10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
ca20: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
ca30: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
ca40: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
ca50: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
ca60: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
ca70: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
ca80: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
ca90: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
caa0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
cab0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
cac0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cad0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
cae0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
caf0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
cb00: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
cb10: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
cb20: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
cb30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
cb40: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
cb50: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
cb60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
cb70: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
cb80: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
cb90: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
cba0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
cbb0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
cbc0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
cbd0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
cbe0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
cbf0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
cc00: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
cc10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
cc20: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
cc30: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
cc40: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
cc50: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
cc60: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
cc70: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
cc80: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
cc90: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
cca0: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
ccb0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
ccc0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
ccd0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
cce0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
ccf0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
cd00: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
cd10: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
cd20: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
cd30: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
cd40: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
cd50: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
cd60: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
cd70: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
cd80: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
cd90: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
cda0: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
cdb0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
cdc0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
cdd0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
cde0: 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
cdf0: 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
ce00: 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
ce10: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
ce20: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
ce30: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
ce40: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
ce50: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
ce60: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
ce70: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
ce80: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
ce90: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65  #define pager_se
cea0: 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64  t_pagehash(X).#d
ceb0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
cec0: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
ced0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cee0: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
cef0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
cf00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cf10: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
cf20: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
cf30: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cf40: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
cf50: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
cf60: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
cf70: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
cf80: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
cf90: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
cfa0: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
cfb0: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
cfc0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
cfd0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
cfe0: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
cff0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
d000: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
d010: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
d020: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d030: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
d040: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
d050: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
d060: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
d070: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
d080: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
d090: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
d0a0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
d0b0: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
d0c0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
d0d0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
d0e0: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
d0f0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
d100: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d110: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
d120: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d130: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
d140: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
d150: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
d160: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
d170: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
d180: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
d190: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
d1a0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
d1b0: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
d1c0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
d1d0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
d1e0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d1f0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d200: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
d210: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
d220: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
d230: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
d240: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
d250: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
d260: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
d270: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
d280: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
d290: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
d2a0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
d2b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
d2c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
d2d0: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
d2e0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
d2f0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d300: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
d310: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
d320: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
d330: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
d340: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d350: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
d360: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
d370: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
d380: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
d390: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
d3a0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
d3b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
d3c0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
d3d0: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
d3e0: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
d3f0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
d400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d410: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d420: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
d430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
d440: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
d450: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d460: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
d470: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
d480: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
d490: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
d4a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
d4b0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
d4c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d4d0: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
d4e0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
d4f0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
d500: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
d510: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
d520: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
d530: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
d540: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
d550: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
d560: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
d570: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
d580: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
d590: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
d5a0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d5b0: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
d5c0: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
d5d0: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
d5e0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
d5f0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
d600: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
d610: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
d620: 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20     || len==0 .  
d630: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d640: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d650: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
d660: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
d670: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d680: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d690: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
d6a0: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
d6b0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
d6c0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
d6d0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d6e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
d6f0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
d700: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
d710: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
d720: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
d730: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
d740: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
d750: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d760: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
d770: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
d780: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
d790: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
d7a0: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
d7b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
d7c0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
d7d0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
d7e0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
d7f0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
d800: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
d810: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d820: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
d830: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
d840: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
d850: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
d860: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
d870: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
d880: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
d890: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
d8a0: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
d8b0: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
d8c0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
d8d0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
d8e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d8f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d900: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
d910: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
d920: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
d930: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
d940: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
d950: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d960: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
d970: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
d980: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
d990: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
d9a0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
d9b0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
d9c0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
d9d0: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
d9e0: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
d9f0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
da00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
da20: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
da30: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
da40: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
da50: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
da60: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
da80: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
dab0: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
dac0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
dad0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
dae0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
daf0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
db00: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
db10: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
db20: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
db30: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
db40: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
db50: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
db60: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
db70: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
db80: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
db90: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
dba0: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
dbb0: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
dbc0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
dbd0: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
dbe0: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
dbf0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
dc00: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
dc10: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
dc20: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
dc30: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
dc40: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
dc50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
dc60: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
dc70: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
dc80: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
dc90: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
dca0: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
dcb0: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
dcc0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
dcd0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
dce0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
dcf0: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
dd00: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
dd10: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
dd20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
dd30: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
dd40: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
dd50: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
dd60: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
dd70: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
dd80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
dd90: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
dda0: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
ddb0: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
ddc0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
ddd0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
dde0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
ddf0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
de00: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
de10: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
de20: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
de30: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
de40: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
de50: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
de60: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
de70: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
de80: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
de90: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
dea0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
deb0: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
dec0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
ded0: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
dee0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
def0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
df00: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
df10: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
df20: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
df30: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
df40: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
df50: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
df60: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
df70: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
df80: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
df90: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
dfa0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
dfb0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
dfc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
dfd0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
dfe0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
dff0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
e000: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
e010: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e040: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
e050: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
e060: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
e070: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
e080: 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65  te3JournalIsInMe
e090: 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64  mory(pPager->jfd
e0a0: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
e0b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
e0c0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
e0d0: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
e0e0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
e0f0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
e100: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
e110: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
e120: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
e130: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
e140: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
e150: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
e160: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
e170: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
e180: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
e190: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
e1a0: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
e1b0: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
e1c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e1d0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
e1e0: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
e1f0: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
e200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e210: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e220: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
e230: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
e240: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
e250: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
e260: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
e270: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
e280: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e290: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
e2a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
e2b0: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
e2c0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
e2d0: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
e2e0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
e2f0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
e300: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
e310: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
e320: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
e330: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
e340: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
e350: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
e360: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
e370: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
e380: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
e390: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
e3a0: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
e3b0: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
e3c0: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
e3d0: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
e3e0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
e3f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e400: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
e410: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
e420: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e430: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
e440: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
e450: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e460: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
e470: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
e480: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
e490: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
e4a0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
e4b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
e4c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e4d0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
e4e0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
e4f0: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
e500: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
e510: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
e520: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e530: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
e540: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
e550: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
e560: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
e570: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
e580: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
e590: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
e5a0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
e5b0: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
e5c0: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
e5d0: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
e5e0: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
e5f0: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
e600: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
e610: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
e620: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e630: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
e640: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
e650: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e660: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
e670: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
e680: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
e690: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
e6a0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
e6b0: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
e6c0: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
e6d0: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
e6e0: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
e6f0: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
e700: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
e710: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
e720: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
e730: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
e740: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e750: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
e760: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e780: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
e790: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
e7a0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e7b0: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
e7c0: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
e7d0: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
e7e0: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
e7f0: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
e800: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
e810: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
e820: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
e830: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e860: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
e870: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
e880: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e8a0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e8b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
e8c0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e8d0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
e8e0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e8f0: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
e900: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
e910: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e920: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
e930: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
e940: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
e950: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e960: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
e970: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
e980: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
e990: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
e9a0: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
e9b0: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
e9c0: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
e9d0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
e9e0: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
e9f0: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
ea00: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
ea10: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
ea20: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
ea30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
ea40: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
ea50: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
ea60: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
ea70: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
ea80: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
ea90: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
eaa0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
eab0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
eac0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ead0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
eae0: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
eaf0: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
eb00: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
eb10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
eb20: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
eb30: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
eb40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
eb50: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
eb60: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
eb70: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
eb80: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
eb90: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
eba0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
ebb0: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
ebc0: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
ebd0: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
ebe0: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
ebf0: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
ec00: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
ec10: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
ec20: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
ec30: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
ec40: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
ec50: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
ec60: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
ec70: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
ec80: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
ec90: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
eca0: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
ecb0: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
ecc0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
ecd0: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
ece0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
ecf0: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
ed00: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
ed10: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
ed20: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
ed30: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
ed40: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
ed50: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
ed60: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
ed70: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
ed80: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
ed90: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
eda0: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
edb0: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
edc0: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
edd0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
ede0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
edf0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
ee00: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
ee10: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
ee20: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
ee30: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
ee40: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
ee50: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
ee60: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
ee70: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
ee80: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
ee90: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
eea0: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
eeb0: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
eec0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
eed0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
eee0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
eef0: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
ef00: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
ef10: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
ef20: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
ef30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ef40: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
ef50: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
ef60: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
ef70: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
ef80: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
ef90: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
efa0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
efb0: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
efc0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
efd0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
efe0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
eff0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
f000: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
f010: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
f020: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
f030: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
f040: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f050: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
f060: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
f070: 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  ash initializer 
f080: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
f090: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
f0a0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f0b0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
f0c0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
f0d0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f0e0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f0f0: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
f100: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
f110: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
f120: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
f130: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f140: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f150: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
f160: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
f170: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
f180: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
f190: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
f1a0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
f1b0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f1c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
f1d0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
f1e0: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
f1f0: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
f200: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f210: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f220: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
f230: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
f240: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
f250: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
f260: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
f270: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
f280: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
f290: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
f2a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
f2b0: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
f2c0: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
f2d0: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
f2e0: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
f2f0: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
f300: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
f310: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
f320: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
f330: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
f340: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
f350: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
f360: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
f370: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
f380: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
f390: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
f3a0: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
f3b0: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
f3c0: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
f3d0: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
f3e0: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
f3f0: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
f400: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
f410: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
f420: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
f430: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
f440: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
f450: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
f460: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
f470: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
f480: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
f490: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
f4a0: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
f4b0: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
f4c0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
f4d0: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
f4e0: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
f4f0: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
f500: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
f510: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
f520: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
f530: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
f540: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
f550: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
f560: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
f570: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
f580: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
f590: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
f5a0: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
f5b0: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
f5c0: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
f5d0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
f5e0: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
f5f0: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
f600: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
f610: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
f620: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
f630: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
f640: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
f650: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
f660: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
f670: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
f680: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
f690: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
f6a0: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
f6b0: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
f6c0: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
f6d0: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
f6e0: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
f6f0: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
f700: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
f710: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
f720: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
f730: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
f740: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
f750: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
f760: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
f770: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
f780: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
f790: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
f7a0: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
f7b0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
f7c0: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
f7d0: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
f7e0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
f7f0: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
f800: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
f810: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f820: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f830: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
f840: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f850: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
f860: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
f870: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
f880: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f890: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
f8a0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f8b0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
f8c0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
f8d0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
f8e0: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
f8f0: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
f900: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
f910: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f920: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
f930: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
f940: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
f950: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
f960: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
f970: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
f980: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
f990: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
f9a0: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
f9b0: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
f9c0: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
f9d0: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
f9e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
f9f0: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
fa00: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
fa10: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
fa20: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
fa30: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
fa40: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
fa50: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
fa60: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
fa70: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
fa80: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
fa90: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
faa0: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
fab0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fac0: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
fad0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
fae0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
faf0: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
fb00: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
fb10: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
fb20: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
fb30: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
fb40: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
fb50: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
fb60: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
fb70: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
fb80: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
fb90: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
fba0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
fbb0: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
fbc0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
fbd0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
fbe0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
fbf0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
fc00: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
fc10: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
fc20: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
fc30: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
fc40: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
fc50: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
fc60: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
fc70: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
fc80: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
fc90: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
fca0: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fcc0: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
fcd0: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
fce0: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
fcf0: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
fd00: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
fd10: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
fd20: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
fd30: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
fd40: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
fd50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
fd60: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
fd70: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
fd80: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
fd90: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
fda0: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
fdb0: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
fdc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fdd0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
fde0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
fdf0: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
fe00: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
fe10: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
fe20: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
fe30: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
fe40: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
fe50: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
fe60: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
fe70: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
fe80: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
fe90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
fea0: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
feb0: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
fec0: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
fed0: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
fee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
fef0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
ff00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
ff10: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
ff20: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
ff30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ff40: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
ff50: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
ff60: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
ff70: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
ff80: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
ff90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ffa0: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
ffb0: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
ffc0: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
ffd0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
ffe0: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
fff0: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
10000 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
10010 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
10020 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
10030 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
10040 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
10050 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
10060 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
10070 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
10080 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
10090 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
100a0 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
100b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
100c0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
100d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
100e0 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
100f0 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
10100 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
10110 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
10120 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10130 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
10140 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
10150 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
10160 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
10170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10180 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
10190 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
101a0 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
101b0 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
101c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
101d0 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
101e0 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
101f0 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
10200 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
10210 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
10220 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
10230 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
10240 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
10250 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
10260 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
10270 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
10280 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
10290 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
102a0 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
102b0 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
102c0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
102d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
102e0 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
102f0 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
10300 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
10310 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
10320 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10330 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
10340 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
10350 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
10360 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
10370 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
10380 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
10390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
103a0 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
103b0 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
103c0 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
103d0 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
103e0 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
103f0 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
10400 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
10410 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
10420 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
10430 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
10440 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
10450 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
10460 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
10470 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
10480 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
10490 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
104a0 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
104b0 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
104c0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
104d0 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
104e0 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
104f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
10500 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10510 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
10520 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
10530 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
10540 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
10550 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
10560 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
10570 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
10580 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
10590 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
105a0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
105b0 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
105c0 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
105d0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
105e0 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
105f0 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
10600 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
10610 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
10620 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
10630 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
10640 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
10650 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
10660 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
10670 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
10680 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
10690 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
106a0 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
106b0 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
106c0 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
106d0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
106e0 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
106f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10700 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
10710 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
10720 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
10730 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
10740 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10760 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
10770 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
10780 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
10790 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
107a0 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
107b0 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
107c0 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
107d0 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
107e0 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
107f0 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
10800 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
10810 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
10820 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
10830 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
10840 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
10850 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
10860 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
10870 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10880 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
10890 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
108a0 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
108b0 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
108c0 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
108d0 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
108e0 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
108f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
10900 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
10910 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
10920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
10930 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
10940 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
10950 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
10960 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
10970 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
10980 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
10990 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
109a0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
109b0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
109c0 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
109d0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
109e0 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
109f0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10a00 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
10a10 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
10a20 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
10a30 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
10a40 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
10a50 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
10a60 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
10a70 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
10a80 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10a90 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10aa0 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10ab0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10ac0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10ad0 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10ae0 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10af0 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10b00 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10b10 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
10b20 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
10b30 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
10b40 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
10b50 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
10b60 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
10b70 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
10b80 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10b90 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10ba0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10bb0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10bc0 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10bd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10be0 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10bf0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10c10 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
10c20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
10c30 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
10c40 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
10c50 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
10c60 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
10c70 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
10c80 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10c90 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10ca0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10cb0 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10cc0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10cd0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10ce0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10cf0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10d00 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10d10 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
10d20 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
10d30 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
10d40 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
10d50 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
10d60 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
10d70 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
10d80 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10d90 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10da0 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10db0 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10dc0 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10dd0 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10de0 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10df0 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10e00 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10e10 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
10e20 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
10e30 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
10e40 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
10e50 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
10e60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10e70 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10e80 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10e90 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10ea0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10eb0 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10ec0 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10ed0 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10ee0 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10ef0 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10f00 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10f10 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
10f20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
10f30 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
10f40 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
10f50 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
10f60 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
10f70 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
10f80 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10f90 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10fa0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fc0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10fd0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10ff0 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
11000 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
11010 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
11020 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
11030 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
11040 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
11050 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
11060 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
11090 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
110a0 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
110b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
110c0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
110d0 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
110e0 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
110f0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
11100 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
11110 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
11120 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
11130 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
11140 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
11150 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
11160 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
11170 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65  RY .   || !isOpe
11180 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20  n(pPager->jfd). 
11190 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
111a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
111b0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
111c0 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
111d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
111e0 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
111f0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
11200 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
11210 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
11220 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
11230 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
11240 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
11250 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
11260 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
11270 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
11280 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
11290 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
112a0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
112b0 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
112c0 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
112d0 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
112e0 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
112f0 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
11300 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
11310 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
11320 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
11330 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
11340 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
11350 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
11360 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
11370 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
11380 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
11390 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
113a0 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
113b0 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
113c0 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
113d0 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
113e0 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
113f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
11400 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
11410 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
11420 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
11430 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
11440 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
11450 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
11460 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
11470 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
11480 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
11490 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
114a0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
114b0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
114c0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
114d0 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
114e0 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
114f0 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
11500 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
11510 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
11520 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
11530 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
11540 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
11550 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
11560 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
11570 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
11580 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
11590 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
115a0 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
115b0 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20 20  lMagic, 8,.     
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64 72              iHdr
115e0 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29  Off+4+nMaster+8)
115f0 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
11600 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
11610 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11620 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b  += (nMaster+20);
11630 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
11640 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
11650 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
11660 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
11670 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
11680 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
11690 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
116a0 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
116b0 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
116c0 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
116d0 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
116e0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
116f0 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
11700 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
11710 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
11720 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
11730 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
11740 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
11750 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
11760 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
11770 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
11780 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
11790 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
117a0 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
117b0 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
117c0 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
117d0 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
117e0 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
117f0 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
11800 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
11810 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53  e..  */ .  if( S
11820 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
11830 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
11840 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
11850 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26  jrnlSize)).   &&
11860 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72   jrnlSize>pPager
11870 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29  ->journalOff.  )
11880 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
11890 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
118a0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
118b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
118c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
118d0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
118e0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
118f0 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
11900 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
11910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11920 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
11930 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
11940 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
11950 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  ion++;.  sqlite3
11960 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
11970 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
11980 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
11990 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
119a0 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
119b0 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67 65  Return the pPage
119c0 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 20  r->iDataVersion 
119d0 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71 6c  value.*/.u32 sql
119e0 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65 72  ite3PagerDataVer
119f0 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  sion(Pager *pPag
11a00 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
11a10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
11a20 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72 65  GER_OPEN );.  re
11a30 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61  turn pPager->iDa
11a40 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a  taVersion;.}../*
11a50 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72  .** Free all str
11a60 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50  uctures in the P
11a70 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b  ager.aSavepoint[
11a80 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20  ] array and set 
11a90 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53  both.** Pager.aS
11aa0 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67  avepoint and Pag
11ab0 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f  er.nSavepoint to
11ac0 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65   zero. Close the
11ad0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
11ae0 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e  if it is open an
11af0 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  d the pager is n
11b00 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
11b10 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mode..*/.static 
11b20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53  void releaseAllS
11b30 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20  avepoints(Pager 
11b40 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
11b50 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11b60 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
11b70 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
11b80 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  h Pager.aSavepoi
11b90 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  nt */.  for(ii=0
11ba0 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11bb0 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11bc0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
11bd0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
11be0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
11bf0 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
11c00 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
11c10 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
11c20 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  || sqlite3Journa
11c30 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67  lIsInMemory(pPag
11c40 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
11c50 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11c60 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
11c70 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
11c80 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  e(pPager->aSavep
11c90 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d  oint);.  pPager-
11ca0 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >aSavepoint = 0;
11cb0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  .  pPager->nSave
11cc0 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
11cd0 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
11ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11cf0 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67  he bit number pg
11d00 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53  no in the PagerS
11d10 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
11d20 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63  point .** bitvec
11d30 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61  s of all open sa
11d40 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e  vepoints. Return
11d50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
11d60 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53  ccessful.** or S
11d70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
11d80 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
11d90 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
11da0 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70  c int addToSavep
11db0 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65  ointBitvecs(Page
11dc0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
11dd0 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b  pgno){.  int ii;
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11e00 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
11e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
11e20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
11e30 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b   */..  for(ii=0;
11e40 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
11e50 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
11e60 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
11e70 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
11e80 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a  aSavepoint[ii];.
11e90 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d      if( pgno<=p-
11ea0 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >nOrig ){.      
11eb0 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74  rc |= sqlite3Bit
11ec0 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76  vecSet(p->pInSav
11ed0 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  epoint, pgno);. 
11ee0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
11ef0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11f00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11f10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
11f20 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
11f30 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EM );.    }.  }.
11f40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11f50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
11f60 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 73 74 61  RVER_EDITION.sta
11f70 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
11f80 65 65 53 65 72 76 65 72 50 61 67 65 28 50 61 67  eeServerPage(Pag
11f90 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 53  er *pPager){.  S
11fa0 65 72 76 65 72 50 61 67 65 20 2a 70 50 67 3b 0a  erverPage *pPg;.
11fb0 20 20 53 65 72 76 65 72 50 61 67 65 20 2a 70 4e    ServerPage *pN
11fc0 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  ext;.  for(pPg=p
11fd0 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 50 61  Pager->pServerPa
11fe0 67 65 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ge; pPg; pPg=pNe
11ff0 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
12000 20 70 50 67 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pPg->pNext;.   
12010 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
12020 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
12030 2d 3e 70 53 65 72 76 65 72 50 61 67 65 20 3d 20  ->pServerPage = 
12040 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
12050 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12060 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
12070 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
12080 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
12090 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
120a0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
120b0 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
120c0 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
120d0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
120e0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
120f0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
12100 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
12110 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
12120 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
12130 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
12140 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
12150 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
12160 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
12170 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
12180 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
12190 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
121a0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
121b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
121c0 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
121d0 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
121e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
121f0 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
12200 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
12210 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
12220 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
12230 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12240 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
12250 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
12260 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
12270 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
12280 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
12290 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
122a0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
122b0 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
122c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
122d0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
122e0 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
122f0 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
12300 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
12310 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
12320 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
12330 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
12340 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
12350 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
12360 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
12370 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
12380 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
12390 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
123a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
123b0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
123c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
123d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
123e0 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
123f0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
12400 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
12410 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69   );..  sqlite3Bi
12420 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
12430 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
12440 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
12450 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c  urnal = 0;.  rel
12460 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
12470 73 28 70 50 61 67 65 72 29 3b 0a 0a 23 69 66 64  s(pPager);..#ifd
12480 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52  ef SQLITE_SERVER
12490 5f 45 44 49 54 49 4f 4e 0a 20 20 69 66 28 20 70  _EDITION.  if( p
124a0 61 67 65 72 49 73 53 65 72 76 65 72 28 70 50 61  agerIsServer(pPa
124b0 67 65 72 29 20 29 7b 0a 20 20 20 20 70 61 67 65  ger) ){.    page
124c0 72 46 72 65 65 53 65 72 76 65 72 50 61 67 65 28  rFreeServerPage(
124d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  pPager);.    sql
124e0 69 74 65 33 53 65 72 76 65 72 45 6e 64 28 70 50  ite3ServerEnd(pP
124f0 61 67 65 72 2d 3e 70 53 65 72 76 65 72 29 3b 0a  ager->pServer);.
12500 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12510 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12520 0a 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66  .  }else .#endif
12530 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
12540 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
12550 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
12560 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
12570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
12580 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
12590 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
125a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
125b0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
125c0 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  N;.  }else if( !
125d0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
125e0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
125f0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
12600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
12610 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
12620 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b  d by pagerUnlock
12630 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Db() */.    int 
12640 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61  iDc = isOpen(pPa
12650 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33  ger->fd)?sqlite3
12660 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
12670 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
12680 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  fd):0;..    /* I
12690 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
126a0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64  system support d
126b0 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20  eletion of open 
126c0 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20  files, then.    
126d0 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ** close the jou
126e0 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
126f0 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
12700 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65  base lock.  Othe
12710 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f  rwise.    ** ano
12720 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
12730 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
12740 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64  e=delete might d
12750 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20  elete the file. 
12760 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75     ** out from u
12770 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
12780 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12790 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
127a0 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20  EMORY   & 5)!=1 
127b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
127c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
127d0 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21  E_OFF      & 5)!
127e0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
127f0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12800 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20  MODE_WAL      & 
12810 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12820 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12830 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
12840 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12850 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12860 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
12870 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ATE & 5)==1 );. 
12880 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12890 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
128a0 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29  RSIST  & 5)==1 )
128b0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44  ;.    if( 0==(iD
128c0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
128d0 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
128e0 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20  N_OPEN).     || 
128f0 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  1!=(pPager->jour
12900 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20  nalMode & 5).   
12910 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12920 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
12930 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
12940 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
12950 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f  r is in the ERRO
12960 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12970 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  call to unlock t
12980 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
12990 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73  ** file fails, s
129a0 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  et the current l
129b0 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  ock to UNKNOWN_L
129c0 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  OCK. See the com
129d0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76  ment.    ** abov
129e0 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
129f0 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  r UNKNOWN_LOCK f
12a00 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
12a10 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  n of why this.  
12a20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72    ** is necessar
12a30 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  y..    */.    rc
12a40 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
12a50 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b  (pPager, NO_LOCK
12a60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12a70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
12a80 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12a90 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  R_ERROR ){.     
12aa0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
12ab0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20   UNKNOWN_LOCK;. 
12ac0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
12ad0 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79   pager state may
12ae0 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d   be changed from
12af0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20   PAGER_ERROR to 
12b00 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a  PAGER_OPEN here.
12b10 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63      ** without c
12b20 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f  learing the erro
12b30 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  r code. This is 
12b40 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68  intentional - th
12b50 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63  e error.    ** c
12b60 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61  ode is cleared a
12b70 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73  nd the cache res
12b80 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  et in the block 
12b90 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
12ba0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12bb0 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
12bc0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
12bd0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20  ER_ERROR );.    
12be0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12bf0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
12c00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12c10 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
12c20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72  }..  /* If Pager
12c30 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
12c40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12c50 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12c60 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20   cannot be.  ** 
12c70 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
12c80 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  t there are no o
12c90 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
12ca0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
12cb0 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20  er,.  ** it can 
12cc0 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b  safely move back
12cd0 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   to PAGER_OPEN s
12ce0 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65  tate. This happe
12cf0 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20  ns in both.  ** 
12d00 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75  normal and exclu
12d10 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
12d20 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
12d30 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
12d40 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  e==SQLITE_OK || 
12d50 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
12d60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12d70 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
12d80 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
12d90 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
12da0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
12db0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12dc0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12dd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
12de0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
12df0 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  N;.    }else{.  
12e00 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12e10 74 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50 61  te = (isOpen(pPa
12e20 67 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45  ger->jfd) ? PAGE
12e30 52 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f 52  R_OPEN : PAGER_R
12e40 45 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20  EADER);.    }.  
12e50 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
12e60 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33  Pager) ) sqlite3
12e70 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
12e80 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->fd, 0, 0);.   
12e90 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12ea0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12eb0 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
12ec0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  d(pPager);.  }..
12ed0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12ee0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
12ef0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
12f00 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
12f10 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
12f20 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12f30 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12f40 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
12f50 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
12f60 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12f70 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12f80 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12f90 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12fa0 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
12fb0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12fc0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
12fd0 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
12fe0 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
12ff0 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
13000 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
13010 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
13020 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
13030 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
13040 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
13050 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
13060 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
13070 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
13080 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
13090 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
130a0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
130b0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
130c0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
130d0 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
130e0 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
130f0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
13100 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
13110 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
13120 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
13130 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
13140 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
13150 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
13160 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
13170 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
13180 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
13190 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
131a0 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
131b0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
131c0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
131d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
131e0 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
131f0 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
13200 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
13210 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
13220 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
13230 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
13240 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
13250 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
13260 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
13270 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
13280 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
13290 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
132a0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
132b0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
132c0 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
132d0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
132e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
132f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13300 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
13310 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
13320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13330 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
13340 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
13350 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
13360 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
13370 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
13380 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
13390 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
133a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
133b0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
133c0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
133d0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
133e0 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
133f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
13400 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
13410 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
13420 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
13430 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
13440 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
13450 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
13460 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
13470 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
13480 4f 52 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65  OR;.    setGette
13490 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b  rMethod(pPager);
134a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
134b0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
134c0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
134d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
134e0 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a  no nPage);../*.*
134f0 2a 20 54 68 65 20 77 72 69 74 65 20 74 72 61 6e  * The write tran
13500 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20  saction open on 
13510 70 50 61 67 65 72 20 69 73 20 62 65 69 6e 67 20  pPager is being 
13520 63 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d  committed (bComm
13530 69 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c  it==1).** or rol
13540 6c 65 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69  led back (bCommi
13550 74 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  t==0)..**.** Ret
13560 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20  urn TRUE if and 
13570 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69 72 74  only if all dirt
13580 79 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62  y pages should b
13590 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
135a0 6b 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a  k..**.** Rules:.
135b0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e  **.**   *  For n
135c0 6f 6e 2d 54 45 4d 50 20 64 61 74 61 62 61 73 65  on-TEMP database
135d0 73 2c 20 61 6c 77 61 79 73 20 73 79 6e 63 20 74  s, always sync t
135e0 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 69 73  o disk.  This is
135f0 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 20 20   necessary.**   
13600 20 20 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69     for transacti
13610 6f 6e 73 20 74 6f 20 62 65 20 64 75 72 61 62 6c  ons to be durabl
13620 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79  e..**.**   *  Sy
13630 6e 63 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  nc TEMP database
13640 20 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49   only on a COMMI
13650 54 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43  T (not a ROLLBAC
13660 4b 29 20 77 68 65 6e 20 74 68 65 20 62 61 63 6b  K) when the back
13670 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  ing.**      file
13680 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
13690 64 20 61 6c 72 65 61 64 79 20 28 76 69 61 20 61  d already (via a
136a0 20 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53   spill on pagerS
136b0 74 72 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20  tress()) and.** 
136c0 20 20 20 20 20 77 68 65 6e 20 74 68 65 20 6e 75       when the nu
136d0 6d 62 65 72 20 6f 66 20 64 69 72 74 79 20 70 61  mber of dirty pa
136e0 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78  ges in memory ex
136f0 63 65 65 64 73 20 32 35 25 20 6f 66 20 74 68 65  ceeds 25% of the
13700 20 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63   total.**      c
13710 61 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  ache size..*/.st
13720 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 46 6c  atic int pagerFl
13730 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65  ushOnCommit(Page
13740 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 62  r *pPager, int b
13750 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20 70  Commit){.  if( p
13760 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
13770 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
13780 20 69 66 28 20 21 62 43 6f 6d 6d 69 74 20 29 20   if( !bCommit ) 
13790 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
137a0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
137b0 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  fd) ) return 0;.
137c0 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65    return (sqlite
137d0 33 50 43 61 63 68 65 50 65 72 63 65 6e 74 44 69  3PCachePercentDi
137e0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
137f0 63 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a  che)>=25);.}../*
13800 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13810 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
13820 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
13830 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
13840 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
13850 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
13860 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
13870 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
13880 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
13890 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
138a0 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
138b0 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
138c0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
138d0 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
138e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
138f0 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
13900 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
13910 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
13920 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
13930 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  n..** .** This r
13940 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
13950 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f  called in PAGER_
13960 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20  ERROR state. If 
13970 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  it is called.** 
13980 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72  in PAGER_NONE or
13990 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
139a0 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ate and the lock
139b0 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a   held is less.**
139c0 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20   exclusive than 
139d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  a RESERVED lock,
139e0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
139f0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
13a00 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
13a10 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
13a20 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
13a30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13a40 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
13a50 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
13a60 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
13a70 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
13a80 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
13a90 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
13aa0 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
13ab0 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
13ac0 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
13ad0 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
13ae0 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
13af0 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
13b00 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
13b10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13b20 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
13b30 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13b40 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
13b50 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
13b60 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
13b70 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
13b80 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
13b90 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
13ba0 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
13bb0 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
13bc0 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
13bd0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13be0 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
13bf0 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
13c00 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
13c10 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
13c20 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
13c30 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
13c40 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
13c50 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
13c60 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
13c70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
13c80 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
13c90 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
13ca0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13cb0 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
13cc0 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
13cd0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
13ce0 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
13cf0 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
13d00 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
13d10 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
13d20 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
13d30 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
13d40 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
13d50 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
13d60 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
13d70 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
13d80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
13d90 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
13da0 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
13db0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
13dc0 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
13dd0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
13de0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
13df0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
13e00 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
13e10 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
13e20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
13e30 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
13e40 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
13e50 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
13e60 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
13e70 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
13e80 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
13e90 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
13ea0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
13eb0 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
13ec0 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
13ed0 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
13ee0 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
13ef0 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
13f00 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
13f10 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
13f20 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  ized, the pager 
13f30 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52  moves to PAGER_R
13f40 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20  EADER state..** 
13f50 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  If running in no
13f60 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c  n-exclusive roll
13f70 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c  back mode, the l
13f80 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
13f90 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65  is .** downgrade
13fa0 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f  d to a SHARED_LO
13fb0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
13fc0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
13fd0 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
13fe0 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
13ff0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a  occurs during.**
14000 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f   any of the IO o
14010 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e  perations to fin
14020 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
14030 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b  l file or unlock
14040 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
14050 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
14060 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14070 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
14080 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72   If the .** oper
14090 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a  ation to finaliz
140a0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
140b0 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  le fails, then t
140c0 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a  he code still.**
140d0 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b   tries to unlock
140e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
140f0 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63  le if not in exc
14100 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20  lusive mode. If 
14110 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70  the.** unlock op
14120 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73  eration fails as
14130 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   well, then the 
14140 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65  first error code
14150 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74   related.** to t
14160 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65  he first error e
14170 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20  ncountered (the 
14180 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
14190 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20  tion one) is.** 
141a0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
141b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
141c0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
141d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
141e0 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20   hasMaster, int 
141f0 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20  bCommit){.  int 
14200 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
14210 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
14220 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
14230 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
14240 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
14250 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
14260 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
14270 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
14280 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
14290 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
142a0 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
142b0 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
142c0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
142d0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
142e0 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
142f0 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
14300 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
14310 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
14320 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
14330 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
14340 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
14350 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
14360 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
14370 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
14380 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
14390 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
143a0 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
143b0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
143c0 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
143d0 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
143e0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
143f0 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
14400 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
14410 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
14420 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
14430 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
14440 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
14450 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
14460 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
14470 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
14480 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
14490 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
144a0 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
144b0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
144c0 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
144d0 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
144e0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
144f0 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
14500 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
14510 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
14520 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
14530 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
14540 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
14550 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14560 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
14570 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
14580 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
14590 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
145a0 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
145b0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
145c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
145d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
145e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
145f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
14600 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
14610 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
14620 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
14630 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
14640 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
14650 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
14660 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
14670 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
14680 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
14690 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
146a0 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
146b0 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
146c0 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
146d0 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
146e0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
146f0 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
14700 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14710 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14720 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a  MODE_MEMORY ); *
14730 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  /.      sqlite3O
14740 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14750 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
14760 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14770 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14780 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
14790 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
147a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
147b0 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
147c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
147d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
147e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
147f0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
14800 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
14810 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14820 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
14830 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
14840 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
14850 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69   sure the new fi
14860 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74  le size is writt
14870 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64  en into the inod
14880 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  e right away..  
14890 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
148a0 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  wise the journal
148b0 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74   might resurrect
148c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
148d0 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20  er loss and.    
148e0 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
148f0 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74  he last transact
14900 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ion to roll back
14910 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20  .  See.         
14920 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a   ** https://bugz
14930 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67  illa.mozilla.org
14940 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64  /show_bug.cgi?id
14950 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20  =1072773.       
14960 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14970 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
14980 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
14990 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
149a0 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  s);.        }.  
149b0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
149c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
149d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
149e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
149f0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14a00 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
14a10 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
14a20 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14a30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
14a40 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
14a50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
14a60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
14a70 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
14a80 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
14a90 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  er||pPager->temp
14aa0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61  File);.      pPa
14ab0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14ac0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
14ad0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
14ae0 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63  anch may be exec
14af0 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e  uted with Pager.
14b00 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
14b10 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ORY if.      ** 
14b20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61  a hot-journal wa
14b30 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61  s just rolled ba
14b40 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
14b50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
14b60 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c     ** file shoul
14b70 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  d be closed and 
14b80 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73  deleted. If this
14b90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
14ba0 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  es to.      ** t
14bb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14bc0 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20  , it will do so 
14bd0 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  using an in-memo
14be0 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ry journal..    
14bf0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62    */.      int b
14c00 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72  Delete = !pPager
14c10 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
14c20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14c30 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f  3JournalIsInMemo
14c40 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d  ry(pPager->jfd)=
14c50 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
14c60 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14c70 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
14c80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
14c90 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
14ca0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14cb0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14cc0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
14cd0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
14ce0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14cf0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14d00 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
14d10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14d20 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
14d30 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
14d40 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  bDelete ){.     
14d50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14d60 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
14d70 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
14d80 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
14d90 65 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20  extraSync);.    
14da0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
14db0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
14dc0 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74  CK_PAGES.  sqlit
14dd0 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
14de0 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
14df0 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
14e00 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28  pagehash);.  if(
14e10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
14e20 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61  =0 && sqlite3Pca
14e30 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
14e40 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
14e50 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
14e60 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
14e70 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  kup(pPager, 1);.
14e80 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
14e90 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d     p->pageHash =
14ea0 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
14eb0 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
14ec0 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ll(p);.    }.  }
14ed0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
14ee0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
14ef0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
14f00 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
14f10 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
14f20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
14f30 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  0;.  if( rc==SQL
14f40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
14f50 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67 65 72  ( MEMDB || pager
14f60 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 70 50  FlushOnCommit(pP
14f70 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29 20 29  ager, bCommit) )
14f80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
14f90 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
14fa0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
14fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14fc0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
14fd0 65 61 72 57 72 69 74 61 62 6c 65 28 70 50 61 67  earWritable(pPag
14fe0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
14ff0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
15000 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50  cacheTruncate(pP
15010 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
15020 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
15030 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
15040 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
15050 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  {.    /* Drop th
15060 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b  e WAL write-lock
15070 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20  , if any. Also, 
15080 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
15090 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a  n was in .    **
150a0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
150b0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74  clusive mode but
150c0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64   is no longer, d
150d0 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56  rop the EXCLUSIV
150e0 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68  E .    ** lock h
150f0 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
15100 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
15110 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
15120 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61  e3WalEndWriteTra
15130 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
15140 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65  >pWal);.    asse
15150 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  rt( rc2==SQLITE_
15160 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OK );.  }else if
15170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15180 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50  && bCommit && pP
15190 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
151a0 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
151b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  ){.    /* This b
151c0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
151d0 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
151e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
151f0 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
15200 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20  .    ** mode if 
15210 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15220 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72  e on disk is lar
15230 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
15240 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
15250 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   ** At this poin
15260 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  t the journal ha
15270 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
15280 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
15290 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63  tion .    ** suc
152a0 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74  cessfully commit
152b0 74 65 64 2c 20 62 75 74 20 74 68 65 20 45 58 43  ted, but the EXC
152c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73  LUSIVE lock is s
152d0 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
152e0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f  .    ** file. So
152f0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 74   it is safe to t
15300 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
15310 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73  base file to its
15320 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
15330 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20  required size.  
15340 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
15350 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
15360 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
15370 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
15380 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
15390 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
153a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
153b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
153c0 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e 28 70  mmit && isOpen(p
153d0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
153e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
153f0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
15400 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
15410 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53  CNTL_COMMIT_PHAS
15420 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66  ETWO, 0);.    if
15430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
15440 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c  FOUND ) rc = SQL
15450 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 23 69 66  ITE_OK;.  }..#if
15460 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45  def SQLITE_SERVE
15470 52 5f 45 44 49 54 49 4f 4e 0a 20 20 69 66 28 20  R_EDITION.  if( 
15480 70 61 67 65 72 49 73 53 65 72 76 65 72 28 70 50  pagerIsServer(pP
15490 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 32  ager) ){.    rc2
154a0 20 3d 20 73 71 6c 69 74 65 33 53 65 72 76 65 72   = sqlite3Server
154b0 52 65 6c 65 61 73 65 57 72 69 74 65 4c 6f 63 6b  ReleaseWriteLock
154c0 73 28 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65  s(pPager->pServe
154d0 72 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  r);.  }else.#end
154e0 69 66 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  if.  if( !pPager
154f0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
15500 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73  .   && (!pagerUs
15510 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20  eWal(pPager) || 
15520 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
15530 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
15540 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20  pWal, 0)).  ){. 
15550 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e     rc2 = pagerUn
15560 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
15570 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
15580 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
15590 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
155a0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  }.  pPager->eSta
155b0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
155c0 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  R;.  pPager->set
155d0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
155e0 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
155f0 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
15600 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
15610 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
15620 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
15630 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
15640 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
15650 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
15660 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
15670 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
15680 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
15690 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a  do not attempt .
156a0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
156b0 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e  at this time. In
156c0 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c  stead, pager_unl
156d0 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ock() is called.
156e0 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   The.** call to 
156f0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
15700 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20  ill discard all 
15710 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c  in-memory pages,
15720 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64   unlock.** the d
15730 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
15740 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20   move the pager 
15750 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
15760 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20  te. If this .** 
15770 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
15780 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15790 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
157a0 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
157b0 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ext .** connecti
157c0 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  on to obtain a s
157d0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
157e0 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
157f0 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
15800 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74  .** will roll it
15810 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
15820 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
15830 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
15840 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
15850 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
15860 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
15870 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
15880 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
15890 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
158a0 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
158b0 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
158c0 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68   ERROR state. Wh
158d0 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
158e0 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
158f0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
15900 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
15910 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
15920 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
15930 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
15940 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15950 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
15960 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
15970 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
15980 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
15990 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
159a0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
159b0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  e(pPager) );.   
159c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
159d0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
159e0 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
159f0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
15a00 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15a10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15a20 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
15a30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15a40 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
15a50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15a60 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
15a70 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
15a80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15a90 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
15aa0 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61  ADER );.      pa
15ab0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
15ac0 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30  ion(pPager, 0, 0
15ad0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
15ae0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
15af0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  er);.}../*.** Pa
15b00 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75  rameter aData mu
15b10 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
15b20 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e  ffer of pPager->
15b30 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a  pageSize bytes.*
15b40 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75  * of data. Compu
15b50 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
15b60 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
15b70 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nt the contents 
15b80 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
15b90 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  of data and the 
15ba0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
15bb0 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15bc0 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  it..**.** This i
15bd0 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
15be0 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61  cksum. It is rea
15bf0 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
15c00 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
15c10 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
15c20 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   (pPager->cksumI
15c30 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32  nit) and every 2
15c40 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20  00th byte.** of 
15c50 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73  the page data, s
15c60 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74  tarting with byt
15c70 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72  e offset (pPager
15c80 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e  ->pageSize%200).
15c90 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73  .** Each byte is
15ca0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
15cb0 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65  an 8-bit unsigne
15cc0 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  d integer..**.**
15cd0 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f   Changing the fo
15ce0 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f  rmula used to co
15cf0 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b  mpute this check
15d00 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61  sum results in a
15d10 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n.** incompatibl
15d20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
15d30 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
15d40 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
15d50 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
15d60 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
15d70 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
15d80 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69  y .** scenario i
15d90 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
15da0 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
15db0 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
15dc0 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  e changed. .** I
15dd0 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c  t is much less l
15de0 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
15df0 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
15e00 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
15e10 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
15e20 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
15e30 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
15e40 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
15e50 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
15e60 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
15e70 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
15e80 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
15e90 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
15ea0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  on..*/.static u3
15eb0 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
15ec0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
15ed0 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
15ee0 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
15ef0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20  ger->cksumInit; 
15f00 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
15f10 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74  sum value to ret
15f20 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  urn */.  int i =
15f30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15f40 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20  e-200;          
15f50 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
15f60 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  */.  while( i>0 
15f70 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
15f80 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
15f90 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
15fa0 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
15fb0 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20  *.** Report the 
15fc0 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a  current page siz
15fd0 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
15fe0 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62  reserved bytes b
15ff0 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ack.** to the co
16000 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  dec..*/.#ifdef S
16010 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
16020 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
16030 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65  rReportSize(Page
16040 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
16050 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
16060 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20  SizeChng ){.    
16070 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
16080 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70  zeChng(pPager->p
16090 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70  Codec, pPager->p
160a0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d      (int)pPager-
160d0 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a  >nReserve);.  }.
160e0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
160f0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16100 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70  (X)     /* No-op
16110 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75   if we do not su
16120 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f  pport a codec */
16130 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
16140 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
16150 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
16160 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16170 65 73 65 72 76 65 64 20 62 69 74 73 20 69 73 20  eserved bits is 
16180 74 68 65 20 73 61 6d 65 20 69 6e 20 74 68 65 20  the same in the 
16190 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70  destination.** p
161a0 61 67 65 72 20 61 73 20 69 74 20 69 73 20 69 6e  ager as it is in
161b0 20 74 68 65 20 73 6f 75 72 63 65 2e 20 20 54 68   the source.  Th
161c0 69 73 20 63 6f 6d 65 73 20 75 70 20 77 68 65 6e  is comes up when
161d0 20 61 20 56 41 43 55 55 4d 20 63 68 61 6e 67 65   a VACUUM change
161e0 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
161f0 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
16200 20 74 6f 20 74 68 65 20 22 6f 70 74 69 6d 61 6c   to the "optimal
16210 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69  " amount..*/.voi
16220 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 6c  d sqlite3PagerAl
16230 69 67 6e 52 65 73 65 72 76 65 28 50 61 67 65 72  ignReserve(Pager
16240 20 2a 70 44 65 73 74 2c 20 50 61 67 65 72 20 2a   *pDest, Pager *
16250 70 53 72 63 29 7b 0a 20 20 69 66 28 20 70 44 65  pSrc){.  if( pDe
16260 73 74 2d 3e 6e 52 65 73 65 72 76 65 21 3d 70 53  st->nReserve!=pS
16270 72 63 2d 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a  rc->nReserve ){.
16280 20 20 20 20 70 44 65 73 74 2d 3e 6e 52 65 73 65      pDest->nRese
16290 72 76 65 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73  rve = pSrc->nRes
162a0 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
162b0 65 70 6f 72 74 53 69 7a 65 28 70 44 65 73 74 29  eportSize(pDest)
162c0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
162d0 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
162e0 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
162f0 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
16300 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
16310 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
16320 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
16330 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
16340 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
16350 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
16360 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
16370 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
16380 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
16390 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
163a0 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
163b0 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
163c0 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
163d0 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
163e0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  nal..**.** The m
163f0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
16400 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73  rnal uses checks
16410 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
16420 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
16430 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   .** not..**.** 
16440 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
16450 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
16460 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
16470 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
16480 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
16490 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
164a0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
164b0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
164c0 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
164d0 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
164e0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
164f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
16500 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
16510 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
16520 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
16530 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
16540 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
16550 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
16560 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
16570 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
16580 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
16590 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
165a0 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
165b0 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
165c0 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
165d0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
165e0 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
165f0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
16600 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
16610 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
16620 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
16630 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
16640 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
16650 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
16660 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
16670 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
16680 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
16690 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
166a0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
166b0 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
166c0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
166d0 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
166e0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
166f0 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
16700 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
16710 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
16720 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
16730 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
16740 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
16750 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
16760 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
16770 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
16780 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
16790 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
167a0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
167b0 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
167c0 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
167d0 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
167e0 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
167f0 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
16800 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
16810 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
16820 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
16830 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
16840 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
16850 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
16860 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
16870 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
16880 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
16890 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
168a0 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
168b0 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
168c0 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
168d0 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
168e0 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
168f0 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
16900 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
16910 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
16920 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
16930 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
16940 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
16950 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
16960 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
16970 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
16980 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
16990 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
169a0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
169b0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
169c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
169d0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
169e0 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
169f0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
16a00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
16a10 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
16a20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
16a30 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
16a40 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
16a50 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
16a60 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
16a70 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
16a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
16a90 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
16aa0 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
16ab0 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
16ac0 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
16ad0 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
16ae0 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
16af0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
16b00 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
16b30 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
16b40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
16b50 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b70 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
16b80 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
16b90 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
16ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16bb0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
16bc0 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
16bd0 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
16be0 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
16c10 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
16c20 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
16c30 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
16c40 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
16c50 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
16c60 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
16c70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
16c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16c90 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
16ca0 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
16cb0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
16cc0 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16ce0 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
16cf0 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
16d00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
16d10 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a 20 54 68  AS_CODEC.  /* Th
16d20 65 20 6a 72 6e 6c 45 6e 63 20 66 6c 61 67 20 69  e jrnlEnc flag i
16d30 73 20 74 72 75 65 20 69 66 20 4a 6f 75 72 6e 61  s true if Journa
16d40 6c 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62  l pages should b
16d50 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  e passed through
16d60 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 63 2e  .  ** the codec.
16d70 20 20 49 74 20 69 73 20 66 61 6c 73 65 20 66 6f    It is false fo
16d80 72 20 70 75 72 65 20 69 6e 2d 6d 65 6d 6f 72 79  r pure in-memory
16d90 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
16da0 63 6f 6e 73 74 20 69 6e 74 20 6a 72 6e 6c 45 6e  const int jrnlEn
16db0 63 20 3d 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20  c = (isMainJrnl 
16dc0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
16dd0 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e  nMemory==0);.#en
16de0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 28  dif..  assert( (
16df0 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
16e00 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
16e10 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
16e20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
16e30 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
16e40 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
16e50 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
16e60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
16e70 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
16e80 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
16e90 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
16ea0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
16eb0 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
16ec0 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
16ed0 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
16ee0 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
16ef0 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
16f00 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d   aData = pPager-
16f10 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73  >pTmpSpace;.  as
16f20 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20  sert( aData );  
16f30 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
16f40 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65  torage must have
16f50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
16f60 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73  located */.  ass
16f70 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
16f80 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28  (pPager)==0 || (
16f90 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69  !isMainJrnl && i
16fa0 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20  sSavepnt) );..  
16fb0 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74  /* Either the st
16fc0 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ate is greater t
16fd0 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52  han PAGER_WRITER
16fe0 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61  _CACHEMOD (a tra
16ff0 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
17000 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  r savepoint roll
17010 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65  back done at the
17020 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20   request of the 
17030 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20  caller) or this 
17040 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  is.  ** a hot-jo
17050 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
17060 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a  If it is a hot-j
17070 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
17080 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
17090 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e  is in state OPEN
170a0 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58   and holds an EX
170b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f  CLUSIVE lock. Ho
170c0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
170d0 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61  ck.  ** only rea
170e0 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
170f0 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68   journal, not th
17100 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
17110 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
17120 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
17130 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
17140 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  MOD.       || (p
17150 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
17160 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61  AGER_OPEN && pPa
17170 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
17180 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
17190 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
171a0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
171b0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
171c0 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29   || isMainJrnl )
171d0 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
171e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
171f0 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20   page data from 
17200 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  the journal or s
17210 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  ub-journal.  ** 
17220 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20  file. Return an 
17230 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
17240 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49  e caller if an I
17250 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  O error occurs..
17260 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d    */.  jfd = isM
17270 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
17280 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
17290 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61  sjfd;.  rc = rea
172a0 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f  d32bits(jfd, *pO
172b0 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
172c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
172d0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
172e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
172f0 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61  Read(jfd, (u8*)a
17300 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
17310 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
17320 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
17330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
17340 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
17350 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
17360 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
17370 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
17380 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
17390 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
173a0 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
173b0 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
173c0 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
173d0 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
173e0 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
173f0 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
17400 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
17410 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
17420 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
17430 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
17440 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
17450 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
17460 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
17470 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
17480 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
17490 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
174a0 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
174b0 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
174c0 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
174d0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
174e0 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
174f0 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
17500 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
17510 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
17520 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
17530 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
17540 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
17550 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
17560 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17570 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
17580 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
17590 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
175a0 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
175b0 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
175c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
175d0 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
175e0 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
175f0 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74  Pager, (u8*)aDat
17600 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
17610 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17620 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
17630 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
17640 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
17650 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
17660 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74   before during t
17670 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
17680 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64  rollback, then d
17690 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70  on't bother to p
176a0 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69  lay it back agai
176b0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  n..  */.  if( pD
176c0 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
176d0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
176e0 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
176f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17700 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
17710 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
17720 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
17730 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
17740 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
17750 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
17760 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
17770 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
17780 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
17790 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
177a0 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
177b0 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
177c0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
177d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
177e0 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f  er is in CACHEMO
177f0 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
17800 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
17810 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
17820 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
17830 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
17840 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
17850 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
17860 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
17870 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
17880 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
17890 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
178a0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
178b0 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
178c0 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
178d0 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
178e0 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
178f0 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
17900 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
17910 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
17920 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
17930 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
17940 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
17950 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
17960 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
17970 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
17980 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
17990 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
179a0 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
179b0 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
179c0 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
179d0 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
179e0 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
179f0 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
17a00 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
17a10 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
17a20 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
17a30 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  If in WRITER_DBM
17a40 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53  OD, WRITER_FINIS
17a50 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  HED or OPEN stat
17a60 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
17a70 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72  e the.  ** pager
17a80 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
17a90 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  sts and the main
17aa0 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
17ab0 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a  is then marked .
17ac0 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20    ** not dirty. 
17ad0 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20  Since this code 
17ae0 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64  is only executed
17af0 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
17b00 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20  tate for.  ** a 
17b10 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
17b20 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72  back, it is guar
17b30 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
17b40 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d  page-cache is em
17b50 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  pty.  ** if the 
17b60 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e  pager is in OPEN
17b70 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a   state..  **.  *
17b80 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
17b90 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
17ba0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
17bb0 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
17bc0 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
17bd0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
17be0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
17bf0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
17c00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
17c10 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
17c20 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
17c30 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
17c40 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
17c50 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
17c60 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
17c70 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
17c80 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
17c90 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
17ca0 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
17cb0 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
17cc0 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
17cd0 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
17ce0 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
17cf0 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
17d00 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
17d10 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
17d20 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
17d30 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
17d40 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
17d50 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
17d60 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
17d70 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
17d80 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
17d90 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
17da0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
17db0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
17dc0 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
17dd0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
17de0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
17df0 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
17e00 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
17e10 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
17e20 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
17e30 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
17e40 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
17e50 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
17e60 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
17e70 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
17e80 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
17e90 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
17ea0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
17eb0 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
17ec0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
17ed0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
17ee0 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
17ef0 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
17f00 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
17f10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
17f20 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
17f30 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
17f40 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
17f50 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
17f60 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
17f70 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
17f80 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
17f90 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
17fa0 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
17fb0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
17fc0 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
17fd0 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
17fe0 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
17ff0 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
18000 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
18010 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
18020 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
18030 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
18040 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
18050 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
18060 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
18070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
18080 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
18090 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
180a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
180b0 46 69 6c 65 20 29 3b 0a 20 20 50 41 47 45 52 54  File );.  PAGERT
180c0 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
180d0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
180e0 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
180f0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
18100 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
18110 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
18120 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
18130 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
18140 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
18150 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
18160 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
18170 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
18180 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
18190 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
181a0 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
181b0 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
181c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
181d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
181e0 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
181f0 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
18200 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
18210 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
18220 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18230 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
18240 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
18250 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
18260 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
18270 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
18280 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
18290 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
182a0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
182b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
182c0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
182d0 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
182e0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
182f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
18300 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
18310 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
18320 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
18330 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 61   /* Write the da
18340 74 61 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ta read from the
18350 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 20 69 6e   journal back in
18360 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
18370 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69  file..    ** Thi
18380 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66  s is usually saf
18390 65 20 65 76 65 6e 20 66 6f 72 20 61 6e 20 65 6e  e even for an en
183a0 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
183b0 20 2d 20 61 73 20 74 68 65 20 64 61 74 61 0a 20   - as the data. 
183c0 20 20 20 2a 2a 20 77 61 73 20 65 6e 63 72 79 70     ** was encryp
183d0 74 65 64 20 62 65 66 6f 72 65 20 69 74 20 77 61  ted before it wa
183e0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
183f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18400 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20  he exception.   
18410 20 2a 2a 20 69 73 20 69 66 20 74 68 65 20 64 61   ** is if the da
18420 74 61 20 77 61 73 20 6a 75 73 74 20 72 65 61 64  ta was just read
18430 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f   from an in-memo
18440 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ry sub-journal. 
18450 49 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  In that.    ** c
18460 61 73 65 20 69 74 20 6d 75 73 74 20 62 65 20 65  ase it must be e
18470 6e 63 72 79 70 74 65 64 20 68 65 72 65 20 62 65  ncrypted here be
18480 66 6f 72 65 20 69 74 20 69 73 20 63 6f 70 69 65  fore it is copie
18490 64 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  d into the datab
184a0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  ase.    ** file.
184b0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
184c0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
184d0 20 69 66 28 20 21 6a 72 6e 6c 45 6e 63 20 29 7b   if( !jrnlEnc ){
184e0 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
184f0 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
18500 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 7, rc=SQLITE_
18510 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74  NOMEM_BKPT, aDat
18520 61 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  a);.      rc = s
18530 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
18540 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29  ager->fd, (u8 *)
18550 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
18560 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a  ageSize, ofst);.
18570 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
18580 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18590 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
185a0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
185b0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
185c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
185d0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
185e0 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50   (u8 *)aData, pP
185f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
18600 6f 66 73 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  ofst);..    if( 
18610 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
18620 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
18630 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
18640 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
18650 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
18660 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 23 69 66  ->pBackup ){.#if
18670 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
18680 4f 44 45 43 0a 20 20 20 20 20 20 69 66 28 20 6a  ODEC.      if( j
18690 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20 20 20 20  rnlEnc ){.      
186a0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
186b0 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
186c0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
186d0 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20 20 20 20  _BKPT);.        
186e0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
186f0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
18700 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
18710 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  aData);.        
18720 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
18730 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
18740 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
18750 4b 50 54 2c 61 44 61 74 61 29 3b 0a 20 20 20 20  KPT,aData);.    
18760 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
18770 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
18780 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
18790 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
187a0 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
187b0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
187c0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
187d0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
187e0 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
187f0 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
18800 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
18810 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
18820 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
18830 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
18840 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
18850 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
18860 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
18870 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
18880 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
18890 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
188a0 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
188b0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
188c0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
188d0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
188e0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
188f0 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
18900 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
18910 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
18920 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
18930 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
18940 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
18950 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
18960 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
18970 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
18980 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
18990 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
189a0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
189b0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
189c0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
189d0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
189e0 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
189f0 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
18a00 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
18a10 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
18a20 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
18a30 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
18a40 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
18a50 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
18a60 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
18a70 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
18a80 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
18a90 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
18aa0 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
18ab0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
18ac0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
18ad0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
18ae0 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
18af0 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
18b00 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
18b10 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
18b20 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
18b30 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
18b40 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
18b50 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
18b60 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
18b70 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
18b80 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18b90 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
18ba0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
18bb0 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
18bc0 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
18bd0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
18be0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
18bf0 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  g, 1);.    asser
18c00 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
18c10 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
18c20 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20  AG_ROLLBACK)!=0 
18c30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
18c40 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
18c50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18c60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18c70 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
18c80 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   rc;.    sqlite3
18c90 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
18ca0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
18cb0 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
18cc0 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
18cd0 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
18ce0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
18cf0 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
18d00 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
18d10 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
18d20 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
18d30 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
18d40 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
18d50 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
18d60 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
18d70 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
18d80 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
18d90 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
18da0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
18db0 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
18dc0 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
18dd0 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
18de0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
18df0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
18e00 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
18e10 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
18e20 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
18e30 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
18e40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18e50 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
18e60 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
18e70 20 20 20 20 2f 2a 20 49 74 20 75 73 65 64 20 74      /* It used t
18e80 6f 20 62 65 20 74 68 61 74 20 73 71 6c 69 74 65  o be that sqlite
18e90 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
18ea0 28 70 50 67 29 20 77 61 73 20 63 61 6c 6c 65 64  (pPg) was called
18eb0 20 68 65 72 65 2e 20 20 42 75 74 0a 20 20 20 20   here.  But.    
18ec0 2a 2a 20 74 68 61 74 20 63 61 6c 6c 20 77 61 73  ** that call was
18ed0 20 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 68   dangerous and h
18ee0 61 64 20 6e 6f 20 64 65 74 65 63 74 61 62 6c 65  ad no detectable
18ef0 20 62 65 6e 65 66 69 74 20 73 69 6e 63 65 20 74   benefit since t
18f00 68 65 20 63 61 63 68 65 0a 20 20 20 20 2a 2a 20  he cache.    ** 
18f10 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6c 65 61  is normally clea
18f20 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
18f30 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 61  acheCleanAll() a
18f40 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  fter rollback an
18f50 64 20 73 6f 0a 20 20 20 20 2a 2a 20 68 61 73 20  d so.    ** has 
18f60 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 20 2a 2f  been removed. */
18f70 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
18f80 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20  agehash(pPg);.. 
18f90 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
18fa0 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
18fb0 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
18fc0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
18fd0 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  Vers..    ** Do 
18fe0 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20  this before any 
18ff0 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20  decoding. */.   
19000 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
19010 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
19020 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
19030 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b  , &((u8*)pData)[
19040 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65  24],sizeof(pPage
19050 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
19060 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
19070 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a  ecode the page j
19080 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ust read from di
19090 73 6b 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  sk */.#if SQLITE
190a0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69  _HAS_CODEC.    i
190b0 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 20 43 4f  f( jrnlEnc ){ CO
190c0 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
190d0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
190e0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
190f0 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23 65 6e 64 69  M_BKPT); }.#endi
19100 66 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  f.    sqlite3Pca
19110 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
19120 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
19140 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
19150 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
19160 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19170 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
19180 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
19190 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
191a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
191b0 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
191c0 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
191d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
191e0 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
191f0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
19200 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
19210 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
19220 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
19230 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
19240 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
19250 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
19260 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
19270 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
19280 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
19290 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
192a0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
192b0 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20  * When a master 
192c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
192d0 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70  created, it is p
192e0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
192f0 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61  e names .** of a
19300 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
19310 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66  journals, one af
19320 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72  ter another, for
19330 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20  matted as utf-8 
19340 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74  .** encoded text
19350 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63  . The end of eac
19360 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
19370 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77  file is marked w
19380 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65  ith a .** nul-te
19390 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30  rminator byte (0
193a0 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65  x00). i.e. the e
193b0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
193c0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
193d0 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61  al.** file for a
193e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76   transaction inv
193f0 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62  olving two datab
19400 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a  ases might be:.*
19410 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69  *.**   "/home/bi
19420 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/a.db-journal\
19430 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e  x00/home/bill/b.
19440 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a  db-journal\x00".
19450 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a  **.** A master j
19460 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
19470 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20  only be deleted 
19480 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  once all of its 
19490 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61  child .** journa
194a0 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c  ls have been rol
194b0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
194c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
194d0 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ads the contents
194e0 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
194f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
19500 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
19510 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61  loops through ea
19520 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
19530 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46  journal names. F
19540 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64  or.** each child
19550 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65   journal, it che
19560 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  cks if:.**.**   
19570 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
19580 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61  ournal exists, a
19590 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20  nd if so.**   * 
195a0 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
195b0 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  rnal contains a 
195c0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73  reference to mas
195d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  ter journal .** 
195e0 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72      file zMaster
195f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c  .**.** If a chil
19600 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
19610 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63   found that matc
19620 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20  hes both of the 
19630 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76  criteria.** abov
19640 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
19650 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
19660 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
19670 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
19680 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20  * no such child 
19690 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
196a0 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74  ound, file zMast
196b0 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  er is deleted fr
196c0 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  om.** the file-s
196d0 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69  ystem using sqli
196e0 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
196f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
19700 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20  ror within this 
19710 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72  function, an err
19720 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
19730 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ned. This.** fun
19740 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
19750 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
19760 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
19770 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74  ). If an allocat
19780 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  ion.** fails, SQ
19790 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
197a0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
197b0 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d  e, if no IO or m
197c0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a  alloc errors .**
197d0 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
197e0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
197f0 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  *.** TODO: This 
19800 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
19810 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63  es a single bloc
19820 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c  k of memory to l
19830 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  oad.** the entir
19840 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
19850 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19860 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c   file. This coul
19870 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65  d be.** a couple
19880 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72   of kilobytes or
19890 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c   so - potentiall
198a0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  y larger than th
198b0 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e  e page .** size.
198c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
198d0 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
198e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
198f0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
19900 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
19910 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
19920 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
19930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19940 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
19950 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
19960 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20  file *pMaster;  
19970 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61    /* Malloc'd ma
19980 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
19990 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
199a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
199b0 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d  pJournal;   /* M
199c0 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f  alloc'd child-jo
199d0 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
199e0 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  iptor */.  char 
199f0 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
19a00 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
19a10 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
19a20 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
19a30 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
19a40 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
19a50 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
19a60 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
19a70 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
19a80 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
19a90 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77  to one journal w
19aa0 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f  ithin MJ file */
19ab0 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
19ac0 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ptr;         /* 
19ad0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a  Space to hold MJ
19ae0 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61   filename from a
19af0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
19b00 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74  .  int nMasterPt
19b10 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
19b20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  Amount of space 
19b30 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61  allocated to zMa
19b40 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20  sterPtr[] */..  
19b50 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
19b60 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
19b70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
19b80 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
19b90 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
19ba0 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
19bb0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19bc0 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
19bd0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
19be0 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
19bf0 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
19c00 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
19c10 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
19c20 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
19c30 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
19c40 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
19c50 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
19c60 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
19c70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19c80 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  OMEM_BKPT;.  }el
19c90 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  se{.    const in
19ca0 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
19cb0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
19cc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
19cd0 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
19ce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
19cf0 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
19d00 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
19d10 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
19d20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19d30 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19d40 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  out;..  /* Load 
19d50 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
19d60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
19d70 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
19d80 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c  ed from.  ** sql
19d90 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
19da0 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
19db0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
19dc0 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20    Also obtain.  
19dd0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ** sufficient sp
19de0 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50  ace (in zMasterP
19df0 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  tr) to hold the 
19e00 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a  names of master.
19e10 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
19e20 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
19e30 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61  m regular rollba
19e40 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ck-journals..  *
19e50 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
19e60 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
19e70 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
19e80 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
19e90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
19ea0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19eb0 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70    nMasterPtr = p
19ec0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
19ed0 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  1;.  zMasterJour
19ee0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
19ef0 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
19f00 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20  al + nMasterPtr 
19f10 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61  + 1);.  if( !zMa
19f20 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
19f30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19f40 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67  OMEM_BKPT;.    g
19f50 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
19f60 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  t;.  }.  zMaster
19f70 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f  Ptr = &zMasterJo
19f80 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
19f90 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20  rnal+1];.  rc = 
19fa0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
19fb0 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
19fc0 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73  urnal, (int)nMas
19fd0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
19fe0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19ff0 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
1a000 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73  ster_out;.  zMas
1a010 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
1a020 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
1a030 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d  .  zJournal = zM
1a040 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
1a050 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
1a060 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
1a070 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
1a080 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74  ){.    int exist
1a090 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  s;.    rc = sqli
1a0a0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1a0b0 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
1a0c0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1a0d0 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
1a0e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a0f0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
1a100 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a110 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69     }.    if( exi
1a120 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  sts ){.      /* 
1a130 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
1a140 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
1a150 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
1a160 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
1a170 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
1a180 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
1a190 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
1a1a0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
1a1b0 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
1a1c0 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
1a1d0 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
1a1e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
1a1f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1a200 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  c;.      int fla
1a210 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
1a220 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
1a230 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1a240 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  NAL);.      rc =
1a250 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1a260 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70  Vfs, zJournal, p
1a270 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20  Journal, flags, 
1a280 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1a290 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a2a0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
1a2b0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
1a2c0 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72   }..      rc = r
1a2d0 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1a2e0 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
1a2f0 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
1a300 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
1a310 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
1a320 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
1a330 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a340 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
1a350 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
1a360 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d   }..      c = zM
1a370 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
1a380 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
1a390 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
1a3a0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b  ;.      if( c ){
1a3b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68  .        /* We h
1a3c0 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
1a3d0 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
1a3e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a3f0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  le. */.        g
1a400 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1a410 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1a420 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d  .    zJournal +=
1a430 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
1a440 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  0(zJournal)+1);.
1a450 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f    }. .  sqlite3O
1a460 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
1a470 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1a480 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
1a490 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
1a4a0 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  aster_out:.  sql
1a4b0 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
1a4c0 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
1a4d0 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   pMaster ){.    
1a4e0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
1a4f0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
1a500 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f  ert( !isOpen(pJo
1a510 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71  urnal) );.    sq
1a520 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74  lite3_free(pMast
1a530 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1a540 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1a550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1a560 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
1a570 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
1a580 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1a590 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
1a5a0 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
1a5b0 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
1a5c0 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
1a5d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
1a5e0 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
1a5f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
1a600 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
1a610 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
1a620 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
1a630 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1a640 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
1a650 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72  en, or the pager
1a660 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65   is not in eithe
1a670 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50  r.** DBMOD or OP
1a680 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  EN state, this f
1a690 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1a6a0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
1a6b0 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74  he size .** of t
1a6c0 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67  he file is chang
1a6d0 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ed to nPage page
1a6e0 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d  s (nPage*pPager-
1a6f0 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29  >pageSize bytes)
1a700 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  . .** If the fil
1a710 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  e on disk is cur
1a720 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
1a730 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
1a740 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
1a750 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
1a760 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
1a770 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
1a780 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   it might be the
1a790 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
1a7a0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
1a7b0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
1a7c0 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
1a7d0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
1a7e0 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
1a7f0 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
1a800 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
1a810 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
1a820 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
1a830 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
1a840 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
1a850 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
1a860 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
1a870 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
1a880 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
1a890 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
1a8a0 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
1a8b0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
1a8c0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
1a8d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
1a8e0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1a8f0 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
1a900 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
1a910 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
1a920 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
1a930 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
1a940 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1a950 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
1a960 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
1a970 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
1a980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
1a990 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1a9a0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
1a9b0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
1a9c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
1a9d0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
1a9e0 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70   .  if( isOpen(p
1a9f0 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26  Pager->fd) .   &
1aa00 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1aa10 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1aa20 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1aa30 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1aa40 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69  PEN) .  ){.    i
1aa50 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
1aa60 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  newSize;.    int
1aa70 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
1aa80 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1aa90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1aaa0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
1aab0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20  _LOCK );.    /* 
1aac0 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
1aad0 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
1aae0 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
1aaf0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1ab00 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1ab10 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
1ab20 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
1ab30 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36  ize = szPage*(i6
1ab40 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
1ab50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ab60 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
1ab70 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1ab80 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
1ab90 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
1aba0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1abb0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
1abc0 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
1abd0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1abe0 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50  (currentSize+szP
1abf0 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b  age)<=newSize ){
1ac00 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1ac10 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Tmp = pPager->pT
1ac20 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20  mpSpace;.       
1ac30 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c   memset(pTmp, 0,
1ac40 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20   szPage);.      
1ac50 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
1ac60 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20  Size-szPage) == 
1ac70 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
1ac80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ac90 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
1aca0 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65  ) >  currentSize
1acb0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1acc0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1acd0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70  pPager->fd, pTmp
1ace0 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a  , szPage, newSiz
1acf0 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  e-szPage);.     
1ad00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1ad10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ad20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1ad30 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
1ad40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ad50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ad60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ad70 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72   a sanitized ver
1ad80 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74  sion of the sect
1ad90 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69  or-size of OS fi
1ada0 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a  le pFile. The.**
1adb0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1adc0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
1add0 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e  ie between 32 an
1ade0 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  d MAX_SECTOR_SIZ
1adf0 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
1ae00 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  3SectorSize(sqli
1ae10 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
1ae20 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73  {.  int iRet = s
1ae30 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
1ae40 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ze(pFile);.  if(
1ae50 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20   iRet<32 ){.    
1ae60 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65  iRet = 512;.  }e
1ae70 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58  lse if( iRet>MAX
1ae80 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a  _SECTOR_SIZE ){.
1ae90 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f      assert( MAX_
1aea0 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32  SECTOR_SIZE>=512
1aeb0 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d   );.    iRet = M
1aec0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  AX_SECTOR_SIZE;.
1aed0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1aee0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
1aef0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1af00 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
1af10 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74  e variable for t
1af20 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65  he given.** page
1af30 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76  r based on the v
1af40 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1af50 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1af60 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68   method.** of th
1af70 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
1af80 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72  file. The sector
1af90 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73   size will be us
1afa0 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
1afb0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
1afc0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
1afd0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
1afe0 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
1aff0 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
1b000 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
1b010 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
1b020 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
1b030 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
1b040 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
1b050 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
1b060 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
1b070 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
1b080 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
1b090 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1b0a0 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
1b0b0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1b0c0 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
1b0d0 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
1b0e0 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66  nded up to 32 if
1b0f0 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74  .** it is less t
1b100 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64  han 32, or round
1b110 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53  ed down to MAX_S
1b120 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74  ECTOR_SIZE if it
1b130 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
1b140 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  han MAX_SECTOR_S
1b150 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  IZE..**.** If th
1b160 65 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53  e file has the S
1b170 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1b180 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1b190 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73  property, then s
1b1a0 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74  et.** the effect
1b1b0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1b1c0 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76  to its minimum v
1b1d0 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65  alue (512).  The
1b1e0 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70   purpose of.** p
1b1f0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1b200 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74  e is to define t
1b210 68 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73  he "blast radius
1b220 22 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a  " of bytes that.
1b230 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
1b240 69 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72  if a crash occur
1b250 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  s while writing 
1b260 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  to a single byte
1b270 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67   in.** that rang
1b280 65 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57  e.  But with POW
1b290 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1b2a0 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69  , the blast radi
1b2b0 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74  us is zero.** (t
1b2c0 68 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45  hat is what POWE
1b2d0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1b2e0 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69  means), so we mi
1b2f0 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f  nimize the secto
1b300 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20  r.** size.  For 
1b310 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
1b320 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72  ibility of the r
1b330 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1b340 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20  file format,.** 
1b350 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65  we cannot reduce
1b360 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b370 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77  ector size below
1b380 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   512..*/.static 
1b390 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
1b3a0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1b3b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  ){.  assert( isO
1b3c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1b3d0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1b3e0 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ile );..  if( pP
1b3f0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20  ager->tempFile. 
1b400 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
1b410 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1b420 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1b430 20 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   & .            
1b440 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50    SQLITE_IOCAP_P
1b450 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1b460 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  TE)!=0.  ){.    
1b470 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
1b480 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
1b490 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1b4a0 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
1b4b0 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
1b4c0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1b4d0 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
1b4e0 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
1b4f0 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
1b500 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
1b510 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  t. */.    pPager
1b520 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
1b530 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  12;.  }else{.   
1b540 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1b550 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63  ize = sqlite3Sec
1b560 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
1b570 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fd);.  }.}../*.*
1b580 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
1b590 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
1b5a0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1b5b0 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
1b5c0 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
1b5d0 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
1b5e0 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
1b5f0 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
1b600 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1b610 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
1b620 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
1b630 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
1b640 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
1b650 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
1b660 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
1b670 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1b680 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1b690 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
1b6a0 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
1b6b0 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
1b6c0 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
1b6d0 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
1b6e0 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
1b6f0 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
1b700 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
1b710 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
1b720 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
1b730 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1b740 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1b750 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
1b760 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
1b770 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
1b780 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
1b790 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
1b7a0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1b7b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1b7c0 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
1b7d0 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
1b7e0 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
1b7f0 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
1b800 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1b810 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1b820 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  is the sector si
1b830 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a  ze.  The header.
1b840 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73  **       is this
1b850 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73   many bytes in s
1b860 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20  ize..**  (6)  4 
1b870 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1b880 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b890 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
1b8a0 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61  **  (7)  zero pa
1b8b0 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65  dding out to the
1b8c0 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a   next sector siz
1b8d0 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f  e..**  (8)  Zero
1b8e0 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
1b8f0 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
1b900 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
1b910 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
1b920 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
1b930 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
1b940 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
1b950 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
1b960 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
1b970 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
1b980 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
1b990 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
1b9a0 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
1b9b0 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65  st 7 items above
1b9c0 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
1b9d0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
1b9e0 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
1b9f0 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a   the 8th item..*
1ba00 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
1ba10 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
1ba20 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
1ba30 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
1ba40 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
1ba50 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
1ba60 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1ba70 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
1ba80 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
1ba90 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
1baa0 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
1bab0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1bac0 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
1bad0 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
1bae0 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
1baf0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
1bb00 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
1bb10 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
1bb20 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
1bb30 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
1bb40 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
1bb50 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
1bb60 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
1bb70 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
1bb80 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
1bb90 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
1bba0 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
1bbb0 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
1bbc0 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
1bbd0 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
1bbe0 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
1bbf0 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
1bc00 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
1bc10 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
1bc20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
1bc30 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
1bc40 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
1bc50 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
1bc60 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
1bc70 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
1bc80 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
1bc90 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
1bca0 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
1bcb0 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
1bcc0 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
1bcd0 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
1bce0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1bcf0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
1bd00 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
1bd10 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
1bd20 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
1bd30 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
1bd40 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
1bd50 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
1bd60 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
1bd70 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
1bd80 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
1bd90 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
1bda0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
1bdb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1bdc0 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
1bdd0 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
1bde0 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
1bdf0 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
1be00 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
1be10 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
1be20 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
1be30 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
1be40 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
1be50 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
1be60 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
1be70 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
1be80 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1be90 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
1bea0 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
1beb0 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
1bec0 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
1bed0 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
1bee0 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
1bef0 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
1bf00 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
1bf10 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
1bf20 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1bf30 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ed..**.** The is
1bf40 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e  Hot parameter in
1bf50 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
1bf60 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f  are trying to ro
1bf70 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  llback a journal
1bf80 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62  .** that might b
1bf90 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e  e a hot journal.
1bfa0 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62    Or, it could b
1bfb0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
1bfc0 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72  al is .** preser
1bfd0 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a  ved because of J
1bfe0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
1bff0 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44  ST or JOURNALMOD
1c000 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49  E_TRUNCATE..** I
1c010 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
1c020 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73  ally is hot, res
1c030 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63  et the pager cac
1c040 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67  he prior rolling
1c050 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e  .** back any con
1c060 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f  tent.  If the jo
1c070 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20  urnal is merely 
1c080 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72  persistent, no r
1c090 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65  eset is.** neede
1c0a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1c0b0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1c0c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1c0d0 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
1c0e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1c0f0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
1c100 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
1c110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c120 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1c130 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1c140 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c160 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
1c170 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1c180 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c1a0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1c1b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
1c1c0 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
1c1d0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c1e0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
1c1f0 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
1c200 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1c210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1c220 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
1c230 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1c240 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
1c250 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1c260 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
1c270 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f  te3OsAccess() */
1c280 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
1c290 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
1c2a0 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
1c2b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
1c2c0 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50  y */.  int needP
1c2d0 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20  agerReset;      
1c2e0 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
1c2f0 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66   page prior to f
1c300 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61  irst page rollba
1c310 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61  ck */.  int nPla
1c320 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20  yback = 0;      
1c330 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1c340 20 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f 72   of pages restor
1c350 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ed from journal 
1c360 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
1c370 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
1c380 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
1c390 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
1c3a0 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
1c3b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
1c3c0 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
1c3d0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1c3e0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d  ->jfd) );.  rc =
1c3f0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1c400 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
1c410 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
1c420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c430 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c440 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
1c450 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
1c460 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
1c470 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
1c480 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
1c490 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
1c4a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
1c4b0 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
1c4c0 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
1c4d0 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
1c4e0 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
1c4f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
1c500 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
1c510 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
1c520 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
1c530 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
1c540 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
1c550 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
1c560 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
1c570 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
1c580 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
1c590 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
1c5a0 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
1c5b0 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
1c5c0 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
1c5d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
1c5e0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
1c5f0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
1c600 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
1c610 20 20 2a 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20    ** mxPathname 
1c620 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73  is 512, which is
1c630 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1c640 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62   minimum allowab
1c650 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f  le value.  ** fo
1c660 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f  r pageSize..  */
1c670 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
1c680 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1c690 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1c6a0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1c6b0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1c6c0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1c6d0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66  athname+1);.  if
1c6e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c6f0 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b  && zMaster[0] ){
1c700 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c710 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1c720 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
1c730 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1c740 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  res);.  }.  zMas
1c750 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ter = 0;.  if( r
1c760 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1c770 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !res ){.    goto
1c780 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c790 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
1c7a0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e  rnalOff = 0;.  n
1c7b0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1c7c0 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69  isHot;..  /* Thi
1c7d0 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
1c7e0 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20  s either when a 
1c7f0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
1c800 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f   or .  ** pager_
1c810 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1c820 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  e() call returns
1c830 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
1c840 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a  an IO error .  *
1c850 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a  * occurs. .  */.
1c860 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1c870 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
1c880 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
1c890 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
1c8a0 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
1c8b0 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
1c8c0 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
1c8d0 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
1c8e0 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
1c8f0 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
1c900 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
1c910 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
1c920 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61   process must ha
1c930 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ve failed while 
1c940 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
1c950 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
1c960 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
1c970 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
1c980 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
1c990 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
1c9a0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69  nalHdr(pPager, i
1c9b0 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  sHot, szJ, &nRec
1c9c0 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
1c9d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c9e0 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
1c9f0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1ca00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ca10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1ca20 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
1ca30 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
1ca40 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1ca50 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1ca60 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
1ca70 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1ca80 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
1ca90 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
1caa0 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
1cab0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
1cac0 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
1cad0 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
1cae0 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
1caf0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
1cb00 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
1cb10 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
1cb20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1cb30 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
1cb40 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
1cb50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1cb60 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
1cb70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1cb80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cb90 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1cba0 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
1cbb0 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
1cbc0 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f  ((szJ - JOURNAL_
1cbd0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
1cbe0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1cbf0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1cc00 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1cc10 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
1cc20 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
1cc30 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
1cc40 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
1cc50 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
1cc60 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
1cc70 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
1cc80 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
1cc90 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
1cca0 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
1ccb0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1ccc0 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
1ccd0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1cce0 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
1ccf0 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
1cd00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1cd10 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
1cd20 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
1cd30 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
1cd40 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1cd50 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
1cd60 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
1cd70 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
1cd80 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
1cd90 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67   ** When rolling
1cda0 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72   back a hot jour
1cdb0 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77  nal, nRec==0 alw
1cdc0 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ays means that t
1cdd0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63  he next.    ** c
1cde0 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  hunk of the jour
1cdf0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  nal contains zer
1ce00 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f  o pages to be ro
1ce10 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a  lled back.  But.
1ce20 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e      ** when doin
1ce30 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  g a ROLLBACK and
1ce40 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75   the nRec==0 chu
1ce50 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  nk is the last c
1ce60 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74  hunk in.    ** t
1ce70 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d  he journal, it m
1ce80 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f  eans that the jo
1ce90 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
1cea0 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20  ain additional. 
1ceb0 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74     ** pages that
1cec0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c   need to be roll
1ced0 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ed back and that
1cee0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1cef0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f  ages .    ** sho
1cf00 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
1cf10 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  based on the jou
1cf20 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a  rnal file size..
1cf30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1cf40 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
1cf50 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
1cf60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
1cf70 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1cf80 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
1cf90 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
1cfa0 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1cfb0 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
1cfc0 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
1cfd0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1cfe0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1cff0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1d000 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
1d010 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
1d020 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
1d030 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
1d040 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
1d050 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
1d060 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1d070 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1d080 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1d090 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
1d0a0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1d0b0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
1d0c0 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
1d0d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1d0f0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1d100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1d110 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
1d120 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  Pg;.    }..    /
1d130 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
1d140 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
1d150 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
1d160 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  k into the .    
1d170 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1d180 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63   and/or page cac
1d190 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  he..    */.    f
1d1a0 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
1d1b0 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  u++){.      if( 
1d1c0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29  needPagerReset )
1d1d0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
1d1e0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1d1f0 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72         needPager
1d200 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  Reset = 0;.     
1d210 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61   }.      rc = pa
1d220 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1d230 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50  _page(pPager,&pP
1d240 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1d250 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69  ,0,1,0);.      i
1d260 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d270 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61   ){.        nPla
1d280 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d  yback++;.      }
1d290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1d2a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1d2b0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  E ){.          p
1d2c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1d2d0 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
1d2e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d2f0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1d300 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1d310 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1d320 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
1d330 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
1d340 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c  truncated, simpl
1d350 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61  y stop reading a
1d360 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
1d370 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a  processing the j
1d380 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67  ournal. This mig
1d390 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ht happen if the
1d3a0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
1d3b0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f         ** not co
1d3c0 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e  mpletely written
1d3d0 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f   and synced prio
1d3e0 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49  r to a crash.  I
1d3f0 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
1d400 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61   ** case, the da
1d410 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61  tabase should ha
1d420 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ve never been wr
1d430 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20  itten in the.   
1d440 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
1d450 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f  place so it is O
1d460 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e  K to simply aban
1d470 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  don the rollback
1d480 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1d490 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d4a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1d4b0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1d4c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d4d0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
1d4e0 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  e unable to roll
1d4f0 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72  back, quit and r
1d500 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a  eturn the error.
1d510 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64            ** cod
1d520 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
1d530 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f  use the pager to
1d540 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
1d550 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20   state.         
1d560 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66   ** so that no f
1d570 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c  urther harm will
1d580 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61   be done.  Perha
1d590 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  ps the next.    
1d5a0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1d5b0 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77   to come along w
1d5c0 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72  ill be able to r
1d5d0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61  ollback the data
1d5e0 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  base..          
1d5f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
1d600 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1d610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d620 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
1d630 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
1d640 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
1d650 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20  _playback:.  /* 
1d660 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c  Following a roll
1d670 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
1d680 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1d690 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72  e back in its or
1d6a0 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74  iginal.  ** stat
1d6b0 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  e prior to the s
1d6c0 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
1d6d0 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f  saction, so invo
1d6e0 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ke the.  ** SQLI
1d6f0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1d700 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  ANGED file-contr
1d710 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73  ol method to dis
1d720 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73  able the.  ** as
1d730 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65  sertion that the
1d740 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1d750 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65  nter was modifie
1d760 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  d..  */.#ifdef S
1d770 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1d780 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
1d790 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71  ethods ){.    sq
1d7a0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
1d7b0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
1d7c0 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  d,SQLITE_FCNTL_D
1d7d0 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a  B_UNCHANGED,0);.
1d7e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1d7f0 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63   If this playbac
1d800 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  k is happening a
1d810 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20  utomatically as 
1d820 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49  a result of an I
1d830 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  O or .  ** mallo
1d840 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  c error that occ
1d850 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20  urred after the 
1d860 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
1d870 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
1d880 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
1d890 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1d8a0 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
1d8b0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1d8c0 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
1d8d0 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
1d8e0 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
1d8f0 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
1d900 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
1d910 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
1d920 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
1d930 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
1d940 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
1d950 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
1d960 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
1d970 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1d980 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
1d990 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
1d9a0 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
1d9b0 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
1d9c0 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
1d9d0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
1d9e0 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
1d9f0 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
1da00 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
1da10 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
1da20 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
1da30 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
1da40 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1da50 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
1da60 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
1da70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1da80 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
1da90 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1daa0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
1dab0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1dac0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1dad0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1dae0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1daf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1db00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1db10 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1db20 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50  ITE_OK.   && (pP
1db30 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1db40 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
1db50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1db60 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
1db70 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
1db80 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70  lite3PagerSync(p
1db90 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
1dba0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dbb0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
1dbc0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
1dbd0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
1dbe0 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30  ster[0]!='\0', 0
1dbf0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1dc00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dc10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1dc20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1dc30 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
1dc40 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1dc50 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
1dc60 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
1dc70 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
1dc80 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
1dc90 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
1dca0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
1dcb0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
1dcc0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
1dcd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
1dce0 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
1dcf0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65  zMaster);.    te
1dd00 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1dd10 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1dd20 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61  f( isHot && nPla
1dd30 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  yback ){.    sql
1dd40 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
1dd50 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
1dd60 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65  OLLBACK, "recove
1dd70 72 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f  red %d pages fro
1dd80 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  m %s",.         
1dd90 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b         nPlayback
1dda0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1ddb0 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  al);.  }..  /* T
1ddc0 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1ddd0 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
1dde0 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
1ddf0 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
1de00 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
1de10 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
1de20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
1de30 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
1de40 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
1de50 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
1de60 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
1de70 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
1de80 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63  s..  */.  setSec
1de90 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
1dea0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1deb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1dec0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
1ded0 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
1dee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1def0 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  nd into .** pPg-
1df00 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
1df10 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
1df20 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
1df30 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1df40 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
1df50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1df60 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
1df70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
1df80 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
1df90 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
1dfa0 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
1dfb0 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
1dfc0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1dfd0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1dfe0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1dff0 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
1e000 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1e010 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
1e020 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
1e030 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e040 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1e050 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
1e060 50 67 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20  PgHdr *pPg, u32 
1e070 69 46 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72  iFrame){.  Pager
1e080 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1e090 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
1e0a0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
1e0b0 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
1e0c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
1e0d0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
1e0e0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1e0f0 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
1e100 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e110 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
1e120 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1e130 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65  int pgsz = pPage
1e140 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20  r->pageSize; /* 
1e150 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1e160 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  to read */..  as
1e170 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1e180 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
1e190 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  ER && !MEMDB );.
1e1a0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1e1b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
1e1c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e1d0 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69  OMIT_WAL.  if( i
1e1e0 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Frame ){.    /* 
1e1f0 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20  Try to pull the 
1e200 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72  page from the wr
1e210 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a  ite-ahead log. *
1e220 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1e230 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70  e3WalReadFrame(p
1e240 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72  Pager->pWal, iFr
1e250 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e  ame, pgsz, pPg->
1e260 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a  pData);.  }else.
1e270 23 65 6e 64 69 66 0a 20 20 7b 0a 23 69 66 64 65  #endif.  {.#ifde
1e280 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f  f SQLITE_SERVER_
1e290 45 44 49 54 49 4f 4e 0a 20 20 20 20 75 38 20 2a  EDITION.    u8 *
1e2a0 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 69  pData = 0;.    i
1e2b0 66 28 20 70 61 67 65 72 49 73 53 65 72 76 65 72  f( pagerIsServer
1e2c0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1e2d0 20 20 73 71 6c 69 74 65 33 53 65 72 76 65 72 52    sqlite3ServerR
1e2e0 65 61 64 50 61 67 65 28 70 50 61 67 65 72 2d 3e  eadPage(pPager->
1e2f0 70 53 65 72 76 65 72 2c 20 70 67 6e 6f 2c 20 26  pServer, pgno, &
1e300 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  pData);.      if
1e310 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( pData ){.     
1e320 20 20 20 6d 65 6d 63 70 79 28 70 50 67 2d 3e 70     memcpy(pPg->p
1e330 44 61 74 61 2c 20 70 44 61 74 61 2c 20 70 67 73  Data, pData, pgs
1e340 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
1e350 7d 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 3d  }.    if( pData=
1e360 3d 30 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  =0 ){.#endif.   
1e370 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d     i64 iOffset =
1e380 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
1e390 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1e3a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e3b0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1e3c0 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
1e3d0 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
1e3e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1e3f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1e400 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1e410 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1e420 4b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  K;.      }.#ifde
1e430 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f  f SQLITE_SERVER_
1e440 45 44 49 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  EDITION.      if
1e450 28 20 70 61 67 65 72 49 73 53 65 72 76 65 72 28  ( pagerIsServer(
1e460 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1e470 20 20 20 73 71 6c 69 74 65 33 53 65 72 76 65 72     sqlite3Server
1e480 45 6e 64 52 65 61 64 50 61 67 65 28 70 50 61 67  EndReadPage(pPag
1e490 65 72 2d 3e 70 53 65 72 76 65 72 2c 20 70 67 6e  er->pServer, pgn
1e4a0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
1e4b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 0a 0a 20  }.#endif..  }.. 
1e4c0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
1e4d0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1e4e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
1e4f0 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66  ad is unsuccessf
1e500 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69  ul, set the dbFi
1e510 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65  leVers[] to some
1e520 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  thing.      ** t
1e530 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hat will never b
1e540 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76  e a valid file v
1e550 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56  ersion.  dbFileV
1e560 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a  ers[] is a copy.
1e570 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65        ** of byte
1e580 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  s 24..39 of the 
1e590 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73  database.  Bytes
1e5a0 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61   28..31 should a
1e5b0 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a  lways be.      *
1e5c0 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69  * zero or the si
1e5d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1e5e0 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65  se in page. Byte
1e5f0 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e  s 32..35 and 35.
1e600 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f  .39.      ** sho
1e610 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62  uld be page numb
1e620 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65  ers which are ne
1e630 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20  ver 0xffffffff. 
1e640 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20   So filling.    
1e650 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46    ** pPager->dbF
1e660 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61  ileVers[] with a
1e670 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68  ll 0xff bytes sh
1e680 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20  ould suffice..  
1e690 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1e6a0 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64  For an encrypted
1e6b0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73   database, the s
1e6c0 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  ituation is more
1e6d0 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73   complex:  bytes
1e6e0 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39  .      ** 24..39
1e6f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e700 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65   are white noise
1e710 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61  .  But the proba
1e720 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20  bility of.      
1e730 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20 65  ** white noise e
1e740 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73  qualing 16 bytes
1e750 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69   of 0xff is vani
1e760 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f  shingly small so
1e770 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f  .      ** we sho
1e780 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e  uld still be ok.
1e790 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e7a0 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64  memset(pPager->d
1e7b0 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c  bFileVers, 0xff,
1e7c0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1e7d0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1e7e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
1e7f0 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20  8 *dbFileVers = 
1e800 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
1e810 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65  a)[24];.      me
1e820 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1e830 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
1e840 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61  Vers, sizeof(pPa
1e850 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1e860 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43  );.    }.  }.  C
1e870 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50  ODEC1(pPager, pP
1e880 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  g->pData, pgno, 
1e890 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  3, rc = SQLITE_N
1e8a0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20 50  OMEM_BKPT);..  P
1e8b0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1e8c0 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
1e8d0 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
1e8e0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
1e8f0 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
1e900 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
1e910 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1e920 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45   PAGERTRACE(("FE
1e930 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
1e940 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1e960 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
1e970 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1e980 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65  sh(pPg)));..  re
1e990 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e9a0 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c  * Update the val
1e9b0 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  ue of the change
1e9c0 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73  -counter at offs
1e9d0 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e  ets 24 and 92 in
1e9e0 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61  .** the header a
1e9f0 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65  nd the sqlite ve
1ea00 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20  rsion number at 
1ea10 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a  offset 96..**.**
1ea20 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f   This is an unco
1ea30 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65  nditional update
1ea40 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  .  See also the 
1ea50 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1ea60 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f  ecounter().** ro
1ea70 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79  utine which only
1ea80 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
1ea90 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74  nge-counter if t
1eaa0 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74  he update is act
1eab0 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c  ually.** needed,
1eac0 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   as determined b
1ead0 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68  y the pPager->ch
1eae0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74  angeCountDone st
1eaf0 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ate variable..*/
1eb00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
1eb10 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
1eb20 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50  ounter(PgHdr *pP
1eb30 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  g){.  u32 change
1eb40 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20  _counter;..  /* 
1eb50 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1eb60 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1eb70 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1eb80 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1eb90 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1eba0 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
1ebb0 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67  e((u8*)pPg->pPag
1ebc0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b  er->dbFileVers)+
1ebd0 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  1;.  put32bits((
1ebe0 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1ebf0 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
1ec00 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c  unter);..  /* Al
1ec10 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c  so store the SQL
1ec20 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
1ec30 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e  er in bytes 96..
1ec40 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62  99 and in.  ** b
1ec50 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72  ytes 92..95 stor
1ec60 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
1ec70 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  nter for which t
1ec80 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
1ec90 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e  r.  ** is valid.
1eca0 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
1ecb0 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1ecc0 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63  ta)+92, change_c
1ecd0 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32  ounter);.  put32
1ece0 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1ecf0 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c  ->pData)+96, SQL
1ed00 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
1ed10 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ER);.}..#ifndef 
1ed20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1ed30 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1ed40 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ion is invoked o
1ed50 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67  nce for each pag
1ed60 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
1ed70 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74  dy been .** writ
1ed80 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67  ten into the log
1ed90 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c   file when a WAL
1eda0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1edb0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
1edc0 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73  Parameter iPg is
1edd0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1ede0 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54   of said page. T
1edf0 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74  he pCtx argument
1ee00 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79   .** is actually
1ee10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1ee20 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
1ee30 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  e..**.** If page
1ee40 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20   iPg is present 
1ee50 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e  in the cache, an
1ee60 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  d has no outstan
1ee70 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c  ding references,
1ee80 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72  .** it is discar
1ee90 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ded. Otherwise, 
1eea0 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65  if there are one
1eeb0 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
1eec0 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63  ding.** referenc
1eed0 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  es, the page con
1eee0 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64  tent is reloaded
1eef0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1ef00 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74  se. If the.** at
1ef10 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20  tempt to reload 
1ef20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1ef30 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71   database is req
1ef40 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c  uired and fails,
1ef50 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53   .** return an S
1ef60 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1ef70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
1ef80 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
1ef90 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43  c int pagerUndoC
1efa0 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43  allback(void *pC
1efb0 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20  tx, Pgno iPg){. 
1efc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1efd0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1efe0 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
1eff0 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70  pCtx;.  PgHdr *p
1f000 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
1f010 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1f020 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71  r) );.  pPg = sq
1f030 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1f040 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
1f050 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1f060 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
1f070 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
1f080 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
1f090 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
1f0a0 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
1f0b0 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61  {.      u32 iFra
1f0c0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  me = 0;.      rc
1f0d0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
1f0e0 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
1f0f0 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Wal, pPg->pgno, 
1f100 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20  &iFrame);.      
1f110 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f120 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1f130 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
1f140 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , iFrame);.     
1f150 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1f160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f170 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
1f180 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
1f190 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1f1a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
1f1b0 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d  Null(pPg);.    }
1f1c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
1f1d0 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61  lly, if a transa
1f1e0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1f1f0 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70  back, any backup
1f200 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20   processes are. 
1f210 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64   ** updated as d
1f220 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75  ata is copied ou
1f230 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  t of the rollbac
1f240 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e  k journal and in
1f250 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
1f260 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  base. This is no
1f270 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73  t generally poss
1f280 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20  ible with a WAL 
1f290 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a  database, as.  *
1f2a0 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c  * rollback invol
1f2b0 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63  ves simply trunc
1f2c0 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69  ating the log fi
1f2d0 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69  le. Therefore, i
1f2e0 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f  f one.  ** or mo
1f2f0 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61  re frames have a
1f300 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1f310 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28  ten to the log (
1f320 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20  and therefore . 
1f330 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20   ** also copied 
1f340 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20  into the backup 
1f350 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61  databases) as pa
1f360 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  rt of this trans
1f370 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65  action,.  ** the
1f380 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65   backups must be
1f390 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f   restarted..  */
1f3a0 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
1f3b0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
1f3c0 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74  pBackup);..  ret
1f3d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f3e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1f3f0 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c  s called to roll
1f400 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
1f410 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61  on on a WAL data
1f420 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
1f430 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  int pagerRollbac
1f440 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  kWal(Pager *pPag
1f450 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f480 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72   Code */.  PgHdr
1f490 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
1f4a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1f4b0 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
1f4c0 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a  s to revert */..
1f4d0 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67    /* For all pag
1f4e0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
1f4f0 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
1f500 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65  ly dirty or have
1f510 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65   already.  ** be
1f520 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20  en written (but 
1f530 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74  not committed) t
1f540 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20  o the log file, 
1f550 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20  do one of the . 
1f560 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20   ** following:. 
1f570 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73   **.  **   + Dis
1f580 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20  card the cached 
1f590 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e  page (if refcoun
1f5a0 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20  t==0), or.  **  
1f5b0 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63   + Reload page c
1f5c0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1f5d0 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66  database (if ref
1f5e0 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20  count>0)..  */. 
1f5f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1f600 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
1f610 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
1f620 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67  ite3WalUndo(pPag
1f630 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55  er->pWal, pagerU
1f640 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  ndoCallback, (vo
1f650 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20  id *)pPager);.  
1f660 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1f670 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1f680 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1f690 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
1f6a0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1f6b0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1f6c0 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  Next = pList->pD
1f6d0 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70  irty;.    rc = p
1f6e0 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1f6f0 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c  ((void *)pPager,
1f700 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
1f710 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74     pList = pNext
1f720 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1f730 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1f740 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1f750 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
1f760 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1f770 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f  ). As well as lo
1f780 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e  gging.** the con
1f790 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73  tents of the lis
1f7a0 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65  t of pages heade
1f7b0 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e  d by pList (conn
1f7c0 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29  ected by pDirty)
1f7d0 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1f7e0 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20  on notifies any 
1f7f0 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72  active backup pr
1f800 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65  ocesses that the
1f810 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63   pages have.** c
1f820 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  hanged. .**.** T
1f830 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
1f840 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69   passed into thi
1f850 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77  s routine is alw
1f860 61 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61  ays sorted by pa
1f870 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65  ge number..** He
1f880 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61  nce, if page 1 a
1f890 70 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20  ppears anywhere 
1f8a0 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20  on the list, it 
1f8b0 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73  will be the firs
1f8c0 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74  t page..*/ .stat
1f8d0 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46  ic int pagerWalF
1f8e0 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a  rames(.  Pager *
1f8f0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
1f900 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1f910 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
1f920 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  Hdr *pList,     
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f940 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20   List of frames 
1f950 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f  to log */.  Pgno
1f960 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20   nTruncate,     
1f970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1f980 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74  atabase size aft
1f990 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a  er this commit *
1f9a0 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1f9d0 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20  his is a commit 
1f9e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1fa10 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1fa20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  nList;          
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1fa40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1fa50 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48  n pList */.  PgH
1fa60 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa80 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1fa90 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73   pages */..  ass
1faa0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
1fab0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1fac0 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53  List );.#ifdef S
1fad0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
1fae0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1faf0 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e   page list is in
1fb00 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
1fb10 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73   */.  for(p=pLis
1fb20 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74  t; p && p->pDirt
1fb30 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  y; p=p->pDirty){
1fb40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1fb50 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79  pgno < p->pDirty
1fb60 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65  ->pgno );.  }.#e
1fb70 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1fb80 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30  pList->pDirty==0
1fb90 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a   || isCommit );.
1fba0 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29    if( isCommit )
1fbb0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41  {.    /* If a WA
1fbc0 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1fbd0 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
1fbe0 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  , there is no po
1fbf0 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20  int in writing. 
1fc00 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20     ** any pages 
1fc10 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
1fc20 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e  s greater than n
1fc30 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68  Truncate into th
1fc40 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20  e WAL file..    
1fc50 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76  ** They will nev
1fc60 65 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e  er be read by an
1fc70 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d  y client. So rem
1fc80 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
1fc90 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20  e pDirty.    ** 
1fca0 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20  list here. */.  
1fcb0 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74    PgHdr **ppNext
1fcc0 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e   = &pList;.    n
1fcd0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  List = 0;.    fo
1fce0 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e  r(p=pList; (*ppN
1fcf0 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70  ext = p)!=0; p=p
1fd00 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1fd10 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54   if( p->pgno<=nT
1fd20 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1fd30 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e     ppNext = &p->
1fd40 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20  pDirty;.        
1fd50 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  nList++;.      }
1fd60 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1fd70 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65  t( pList );.  }e
1fd80 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  lse{.    nList =
1fd90 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   1;.  }.  pPager
1fda0 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
1fdb0 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69  AT_WRITE] += nLi
1fdc0 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  st;..  if( pList
1fdd0 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
1fde0 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1fdf0 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
1fe00 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1fe10 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1fe20 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1fe30 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1fe40 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1fe50 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d  sCommit, pPager-
1fe60 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20  >walSyncFlags.  
1fe70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1fe80 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1fe90 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
1fea0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1feb0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1fec0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
1fed0 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
1fee0 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e  >pBackup, p->pgn
1fef0 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74  o, (u8 *)p->pDat
1ff00 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  a);.    }.  }..#
1ff10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1ff20 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74  CK_PAGES.  pList
1ff30 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1ff40 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1ff50 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f  ->pPCache);.  fo
1ff60 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1ff70 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1ff80 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
1ff90 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  sh(p);.  }.#endi
1ffa0 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
1ffb0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
1ffc0 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ffd0 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a  n on the WAL..**
1ffe0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1fff0 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c   used to be call
20000 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61  ed "pagerOpenSna
20010 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65  pshot()" because
20020 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a   it essentially.
20030 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73  ** makes a snaps
20040 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  hot of the datab
20050 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65  ase at the curre
20060 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65  nt point in time
20070 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a   and preserves.*
20080 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20  * that snapshot 
20090 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72  for use by the r
200a0 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f  eader in spite o
200b0 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63  f concurrently c
200c0 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68  hanges by.** oth
200d0 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68  er writers or ch
200e0 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  eckpointers..*/.
200f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
20100 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
20110 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
20120 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20140 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
20150 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   code */.  int c
20160 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20  hanged = 0;     
20170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20180 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74  ue if cache must
20190 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20   be reset */..  
201a0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
201b0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
201c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
201d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
201e0 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
201f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
20200 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  DER );..  /* sql
20210 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
20220 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20  ansaction() was 
20230 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  not called for t
20240 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a  he previous.  **
20250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
20260 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
20270 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c  LUSIVE.  So call
20280 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a   it now.  If we.
20290 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b    ** are in lock
202a0 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20  ing_mode=NORMAL 
202b0 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61  and EndRead() wa
202c0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  s previously cal
202d0 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75  led,.  ** the du
202e0 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20  plicate call is 
202f0 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20  harmless..  */. 
20300 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
20310 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
20320 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
20330 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
20340 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
20350 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
20360 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69  , &changed);.  i
20370 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20380 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20   || changed ){. 
20390 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
203a0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
203b0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
203c0 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65   ) sqlite3OsUnfe
203d0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
203e0 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  0, 0);.  }..  re
203f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
20400 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
20410 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20420 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
20430 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20  transition from 
20440 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f  PAGER_OPEN.** to
20450 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
20460 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ate to determine
20470 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20480 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
20490 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75  * in pages (assu
204a0 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69  ming the page si
204b0 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ze currently sto
204c0 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67  red in Pager.pag
204d0 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  eSize)..**.** If
204e0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
204f0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
20500 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
20510 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
20520 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73  base.** in pages
20530 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70   is stored in *p
20540 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65  nPage. Otherwise
20550 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
20560 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49  (perhaps.** SQLI
20570 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20  TE_IOERR_FSTAT) 
20580 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
20590 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20  *pnPage is left 
205a0 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
205b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
205c0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
205d0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e  pPager, Pgno *pn
205e0 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
205f0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
20600 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
20610 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  e to return via 
20620 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a  *pnPage */..  /*
20630 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73   Query the WAL s
20640 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  ub-system for th
20650 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e  e database size.
20660 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29   The WalDbsize()
20670 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  .  ** function r
20680 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74  eturns zero if t
20690 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70  he WAL is not op
206a0 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70  en (i.e. Pager.p
206b0 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  Wal==0), or.  **
206c0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
206d0 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61   size is not ava
206e0 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61  ilable. The data
206f0 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
20700 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
20710 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62  from the WAL sub
20720 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c  -system if the l
20730 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  og file is empty
20740 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   or.  ** contain
20750 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69  s no valid commi
20760 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  tted transaction
20770 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
20780 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20790 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
207a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
207b0 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
207c0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
207d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
207e0 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
207f0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
20800 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65  le==0 );.  nPage
20810 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73   = sqlite3WalDbs
20820 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ize(pPager->pWal
20830 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
20840 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
20850 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
20860 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
20870 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57   from the.  ** W
20880 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64  AL sub-system, d
20890 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67  etermine the pag
208a0 65 20 63 6f 75 6e 74 20 62 61 73 65 64 20 6f 6e  e count based on
208b0 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a   the size of.  *
208c0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
208d0 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a  ile.  If the siz
208e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
208f0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
20900 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75  .  ** integer mu
20910 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
20920 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75  ge-size, round u
20930 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  p the result..  
20940 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  */.  if( nPage==
20950 30 20 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70  0 && ALWAYS(isOp
20960 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
20970 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
20980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20990 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
209a0 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
209b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
209c0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
209d0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
209e0 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  n);.    if( rc!=
209f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20a00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20a10 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
20a20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
20a30 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
20a40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20a50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
20a60 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
20a70 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
20a80 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
20a90 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
20aa0 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
20ab0 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
20ac0 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
20ad0 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
20ae0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
20af0 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
20b00 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
20b10 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
20b20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
20b30 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
20b40 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
20b50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
20b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20b70 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
20b80 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
20b90 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
20ba0 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
20bb0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
20bc0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
20bd0 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
20be0 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
20bf0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
20c00 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
20c10 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
20c20 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
20c30 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
20c40 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
20c50 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
20c60 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
20c70 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20c80 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
20c90 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
20ca0 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
20cb0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
20cc0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20cd0 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
20ce0 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
20cf0 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
20d00 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
20d10 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
20d20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
20d30 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
20d40 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
20d50 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
20d60 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
20d70 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
20d80 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
20d90 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
20da0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20db0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
20dc0 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
20dd0 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
20de0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
20df0 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
20e00 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
20e10 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
20e20 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
20e30 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
20e40 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
20e50 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
20e60 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
20e70 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
20e80 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
20e90 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
20ea0 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
20eb0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
20ec0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
20ed0 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
20ee0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
20ef0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20f00 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
20f10 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20f20 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
20f30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20f40 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
20f50 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
20f60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20f70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
20f80 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
20f90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20fa0 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
20fb0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
20fc0 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
20fd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
20fe0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
20ff0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
21000 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
21010 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
21020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21030 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
21040 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e  {.        Pgno n
21050 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
21060 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
21070 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21080 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  file */..       
21090 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
210a0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
210b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
210c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
210d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  ;.        if( nP
210e0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
210f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21100 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
21110 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
21120 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Wal, 0);.       
21130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21140 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
21150 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
21160 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
21170 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
21180 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21190 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61  PagerOpenWal(pPa
211a0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ger, 0);.       
211b0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
211c0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
211d0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
211e0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
211f0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
21200 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
21210 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21220 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  _DELETE;.      }
21230 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21240 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
21250 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
21260 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
21270 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
21280 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
21290 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
212a0 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
212b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
212c0 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
212d0 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
212e0 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
212f0 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
21300 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
21310 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
21320 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
21330 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
21340 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
21350 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
21360 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
21370 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
21380 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
21390 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
213a0 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
213b0 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
213c0 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
213d0 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
213e0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
213f0 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
21400 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
21410 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
21420 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
21430 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
21440 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
21450 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
21460 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
21470 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
21480 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
21490 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
214a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
214b0 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
214c0 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
214d0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
214e0 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
214f0 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
21500 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
21510 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
21520 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
21530 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
21540 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
21550 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
21560 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
21570 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
21580 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
21590 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
215a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
215b0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
215c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
215d0 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
215e0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
215f0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
21600 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
21610 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
21620 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
21630 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
21640 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
21650 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
21660 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
21670 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
21680 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
21690 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
216a0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
216b0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
216c0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
216d0 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
216e0 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
216f0 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
21700 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
21710 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
21720 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
21730 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
21740 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
21750 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
21760 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
21770 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
21780 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
21790 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
217a0 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
217b0 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
217c0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
217d0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
217e0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
217f0 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
21800 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
21810 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
21820 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
21830 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
21840 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
21850 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
21860 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
21870 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
21880 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
21890 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
218a0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
218b0 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
218c0 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
218d0 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
218e0 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
218f0 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
21900 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
21910 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
21920 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21930 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
21940 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
21950 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
21960 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
21970 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21990 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
219a0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
219b0 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
219c0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
219d0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
219e0 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
219f0 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
21a00 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
21a10 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
21a20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
21a30 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
21a40 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
21a50 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
21a60 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
21a70 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
21a80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
21a90 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
21aa0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
21ab0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
21ac0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
21ad0 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f  R_LOCKED );..  /
21ae0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
21af0 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
21b00 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
21b10 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
21b20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
21b30 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
21b40 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
21b50 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
21b60 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
21b70 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
21b80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21b90 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
21ba0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
21bb0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
21bc0 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ize back to the 
21bd0 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66  value it was bef
21be0 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e  ore the savepoin
21bf0 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  t .  ** being re
21c00 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65  verted was opene
21c10 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  d..  */.  pPager
21c20 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65  ->dbSize = pSave
21c30 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69  point ? pSavepoi
21c40 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67  nt->nOrig : pPag
21c50 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
21c60 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
21c70 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
21c80 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
21c90 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74   if( !pSavepoint
21ca0 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
21cb0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
21cc0 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62  eturn pagerRollb
21cd0 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a  ackWal(pPager);.
21ce0 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50    }..  /* Use pP
21cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21d00 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
21d10 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
21d20 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
21d30 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
21d40 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
21d50 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
21d60 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
21d70 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
21d80 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
21d90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
21da0 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
21db0 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
21dc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21dd0 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
21de0 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
21df0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
21e00 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  alOff;.  assert(
21e10 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
21e20 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d  ger)==0 || szJ==
21e30 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
21e40 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   by rolling back
21e50 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
21e60 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
21e70 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
21e80 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
21e90 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
21ea0 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  nuing to the nex
21eb0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
21ec0 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67  ..  ** There mig
21ed0 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e  ht be records in
21ee0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21ef0 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  l that have a pa
21f00 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67  ge number.  ** g
21f10 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
21f20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
21f30 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64   size (pPager->d
21f40 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65  bSize) but those
21f50 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
21f60 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ipped automatica
21f70 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20  lly.  Pages are 
21f80 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61  added to pDone a
21f90 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20  s they.  ** are 
21fa0 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
21fb0 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
21fc0 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57  nt && !pagerUseW
21fd0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
21fe0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
21ff0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
22000 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
22010 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
22020 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
22030 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
22040 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
22050 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
22060 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
22070 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
22080 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
22090 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
220a0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
220b0 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
220c0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
220d0 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
220e0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
220f0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
22100 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
22110 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
22120 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  0;.  }..  /* Con
22130 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61  tinue rolling ba
22140 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f  ck records out o
22150 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
22160 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
22170 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f   ** the first jo
22180 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65  urnal header see
22190 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  n and continuing
221a0 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63   until the effec
221b0 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  tive end.  ** of
221c0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
221d0 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75  l file.  Continu
221e0 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66  e to skip out-of
221f0 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64  -range pages and
22200 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  .  ** continue a
22210 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c  dding pages roll
22220 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65  ed back to pDone
22230 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
22240 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22250 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22260 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75  Off<szJ ){.    u
22270 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
22280 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
22290 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52  r */.    u32 nJR
222a0 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  ec = 0;     /* N
222b0 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
222c0 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
222d0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
222e0 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
222f0 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a  dr(pPager, 0, sz
22300 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
22310 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
22320 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
22330 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
22340 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a  * The "pPager->j
22350 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
22360 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
22370 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
22380 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73  lOff".    ** tes
22390 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20  t is related to 
223a0 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53  ticket #2565.  S
223b0 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f  ee the discussio
223c0 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  n in the.    ** 
223d0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
223e0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
223f0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
22400 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
22410 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20   if( nJRec==0 . 
22420 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
22430 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
22440 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
22450 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
22460 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  lOff.    ){.    
22470 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28    nJRec = (u32)(
22480 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
22490 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e  ournalOff)/JOURN
224a0 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
224b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
224c0 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
224d0 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63  E_OK && ii<nJRec
224e0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
224f0 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b  nalOff<szJ; ii++
22500 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
22510 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
22520 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
22530 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22540 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
22550 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22560 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
22570 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  NE );.  }.  asse
22580 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
22590 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K || pPager->jou
225a0 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a  rnalOff>=szJ );.
225b0 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20  .  /* Finally,  
225c0 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66  rollback pages f
225d0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
225e0 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20  nal.  Page that 
225f0 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f  were.  ** previo
22600 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  usly rolled back
22610 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
22620 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72   journal (and ar
22630 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65  e hence in pDone
22640 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  ).  ** will be s
22650 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d  kipped.  Out-of-
22660 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20  range pages are 
22670 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20  also skipped..  
22680 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
22690 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69  int ){.    u32 i
226a0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
226b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
226c0 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
226d0 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e  = (i64)pSavepoin
226e0 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50  t->iSubRec*(4+pP
226f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
22700 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
22710 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
22720 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22730 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55  te3WalSavepointU
22740 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
22750 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57  , pSavepoint->aW
22760 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  alData);.    }. 
22770 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70     for(ii=pSavep
22780 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72  oint->iSubRec; r
22790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
227a0 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  ii<pPager->nSubR
227b0 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ec; ii++){.     
227c0 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d   assert( offset=
227d0 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67  =(i64)ii*(4+pPag
227e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b  er->pageSize) );
227f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
22800 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
22810 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66  age(pPager, &off
22820 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31  set, pDone, 0, 1
22830 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
22840 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
22850 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  DONE );.  }..  s
22860 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
22870 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
22880 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22890 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
228a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
228b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
228c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
228d0 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
228e0 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
228f0 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
22900 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66  e allowed.** bef
22910 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
22920 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20  o recycle clean 
22930 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65 73  and unused pages
22940 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22950 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
22960 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
22970 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
22980 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
22990 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
229a0 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
229b0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ge);.}../*.** Ch
229c0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
229d0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
229e0 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
229f0 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62  are allowed.** b
22a00 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
22a10 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20   to spill pages 
22a20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  to journal..*/.i
22a30 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
22a40 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65  etSpillsize(Page
22a50 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
22a60 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  xPage){.  return
22a70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
22a80 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65  tSpillsize(pPage
22a90 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
22aa0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ge);.}../*.** In
22ab0 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  voke SQLITE_FCNT
22ac0 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65  L_MMAP_SIZE base
22ad0 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
22ae0 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70   value of szMmap
22af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22b00 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
22b10 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
22b20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
22b30 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73  _MMAP_SIZE>0.  s
22b40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
22b50 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20  = pPager->fd;.  
22b60 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26  if( isOpen(fd) &
22b70 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  & fd->pMethods->
22b80 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20  iVersion>=3 ){. 
22b90 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
22ba0 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50   sz;.    sz = pP
22bb0 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20  ager->szMmap;.  
22bc0 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65    pPager->bUseFe
22bd0 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20  tch = (sz>0);.  
22be0 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
22bf0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73  d(pPager);.    s
22c00 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
22c10 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
22c20 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
22c30 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29  _MMAP_SIZE, &sz)
22c40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
22c50 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
22c60 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
22c70 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70   any memory mapp
22c80 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20  ing made of the 
22c90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
22ca0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
22cb0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
22cc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73  Pager *pPager, s
22cd0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
22ce0 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  map){.  pPager->
22cf0 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b  szMmap = szMmap;
22d00 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69  .  pagerFixMapli
22d10 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  mit(pPager);.}..
22d20 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75  /*.** Free as mu
22d30 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
22d40 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70  sible from the p
22d50 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ager..*/.void sq
22d60 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b  lite3PagerShrink
22d70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22d80 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
22d90 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70  Shrink(pPager->p
22da0 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
22db0 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67  * Adjust setting
22dc0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74  s of the pager t
22dd0 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
22de0 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73  d in the pgFlags
22df0 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
22e00 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e  * The "level" in
22e10 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
22e20 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
22e30 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73  K sets the robus
22e40 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tness.** of the 
22e50 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
22e60 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
22e70 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61  shes or power fa
22e80 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61  ilures by.** cha
22e90 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
22ea0 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
22eb0 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  n writing the jo
22ec0 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65  urnals..** There
22ed0 20 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c 73   are four levels
22ee0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
22ef0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
22f00 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
22f10 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
22f20 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
22f30 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
22f40 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
22f50 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
22f60 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
22f70 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
22f80 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
22f90 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
22fa0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
22fb0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
22fc0 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
22fd0 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
22fe0 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
23000 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
23010 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
23020 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
23030 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23040 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
23050 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
23060 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
23070 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
23080 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
23090 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
230a0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
230b0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
230d0 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
230e0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
230f0 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
23100 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
23110 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
23120 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
23130 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
23140 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
23150 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
23160 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
23170 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
23180 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
23190 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
231a0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
231b0 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
231c0 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
231d0 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
231e0 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
231f0 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
23200 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
23210 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
23220 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
23230 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
23240 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
23250 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
23260 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
23270 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
23280 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
23290 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
232a0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
232b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
232c0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
232d0 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20 20  **.**    EXTRA  
232e0 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20     This is like 
232f0 46 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61 74  FULL except that
23300 20 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20 74   is also syncs t
23310 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
23320 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
23330 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  t contains the r
23340 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
23350 61 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62 61  after the rollba
23360 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ck.**           
23370 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 6e     journal is un
23380 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  linked..**.** Th
23390 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61  e above is for a
233a0 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
233b0 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c  l mode.  For WAL
233c0 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69   mode, OFF conti
233d0 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20  nues.** to mean 
233e0 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76  that no syncs ev
233f0 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41  er occur.  NORMA
23400 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
23410 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a   WAL is synced.*
23420 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  * prior to the s
23430 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69  tart of checkpoi
23440 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  nt and that the 
23450 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
23460 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68   synced.** at th
23470 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
23480 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
23490 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  f the entire con
234a0 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a  tent of the WAL.
234b0 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62  ** was written b
234c0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
234d0 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73  abase.  But no s
234e0 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  ync operations o
234f0 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f  ccur for.** an o
23500 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69  rdinary commit i
23510 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69  n NORMAL mode wi
23520 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65  th WAL.  FULL me
23530 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
23540 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63  .** file is sync
23550 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ed following eac
23560 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69  h commit operati
23570 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20  on, in addition 
23580 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20  to the.** syncs 
23590 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
235a0 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20 69  NORMAL.  There i
235b0 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
235c0 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20  between FULL.** 
235d0 61 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57 41  and EXTRA for WA
235e0 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  L mode..**.** Do
235f0 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e   not confuse syn
23600 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69  chronous=FULL wi
23610 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  th SQLITE_SYNC_F
23620 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  ULL.  The.** SQL
23630 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61  ITE_SYNC_FULL ma
23640 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65  cro means to use
23650 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c   the MacOSX-styl
23660 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20  e full-fsync.** 
23670 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55  using fcntl(F_FU
23680 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54  LLFSYNC).  SQLIT
23690 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65  E_SYNC_NORMAL me
236a0 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20  ans to do an.** 
236b0 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29  ordinary fsync()
236c0 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73   call.  There is
236d0 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
236e0 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59  etween SQLITE_SY
236f0 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53  NC_FULL.** and S
23700 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
23710 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f  L on platforms o
23720 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58  ther than MacOSX
23730 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79  .  But the.** sy
23740 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76  nchronous=FULL v
23750 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75  ersus synchronou
23760 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67  s=NORMAL setting
23770 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e   determines when
23780 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72  .** the xSync pr
23790 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65  imitive is calle
237a0 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e  d and is relevan
237b0 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72  t to all platfor
237c0 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ms..**.** Numeri
237d0 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
237e0 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
237f0 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
23800 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
23810 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
23820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23830 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
23840 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
23850 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67  rSetFlags(.  Pag
23860 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
23870 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
23880 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65  to set safety le
23890 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73  vel for */.  uns
238a0 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
238b0 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c     /* Various fl
238c0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  ags */.){.  unsi
238d0 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46  gned level = pgF
238e0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e  lags & PAGER_SYN
238f0 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20  CHRONOUS_MASK;. 
23900 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
23910 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
23920 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b  ger->noSync = 1;
23930 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
23940 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  lSync = 0;.    p
23950 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
23960 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
23970 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
23980 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45  c =  level==PAGE
23990 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46  R_SYNCHRONOUS_OF
239a0 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67  F ?1:0;.    pPag
239b0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
239c0 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43  evel>=PAGER_SYNC
239d0 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a  HRONOUS_FULL ?1:
239e0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
239f0 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c  xtraSync = level
23a00 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  ==PAGER_SYNCHRON
23a10 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a  OUS_EXTRA ?1:0;.
23a20 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
23a30 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
23a40 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23a50 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  s = 0;.    pPage
23a60 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
23a70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
23a80 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
23a90 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  R_FULLFSYNC ){. 
23aa0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
23ab0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
23ac0 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61  NC_FULL;.    pPa
23ad0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
23ae0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
23af0 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69  _FULL;.  }else i
23b00 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
23b10 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
23b20 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  C ){.    pPager-
23b30 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
23b40 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
23b50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
23b60 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
23b70 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
23b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
23b90 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
23ba0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
23bb0 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
23bc0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
23bd0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
23be0 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  AL;.  }.  pPager
23bf0 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d  ->walSyncFlags =
23c00 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
23c10 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  gs;.  if( pPager
23c20 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
23c30 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
23c40 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59  cFlags |= WAL_SY
23c50 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b  NC_TRANSACTIONS;
23c60 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61  .  }.  if( pgFla
23c70 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45  gs & PAGER_CACHE
23c80 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61  SPILL ){.    pPa
23c90 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
23ca0 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  &= ~SPILLFLAG_OF
23cb0 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  F;.  }else{.    
23cc0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
23cd0 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
23ce0 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  OFF;.  }.}.#endi
23cf0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
23d00 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
23d10 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
23d20 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
23d30 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
23d40 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
23d50 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
23d60 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
23d70 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
23d80 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
23d90 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
23da0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
23db0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
23dc0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
23dd0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
23de0 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
23df0 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
23e00 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
23e10 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
23e20 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
23e30 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
23e40 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
23e50 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
23e60 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
23e70 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
23e80 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
23e90 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
23ea0 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
23eb0 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
23ec0 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
23ed0 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
23ee0 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
23ef0 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
23f00 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
23f10 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
23f20 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
23f30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
23f40 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
23f50 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
23f60 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
23f70 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
23f80 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
23f90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
23fa0 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
23fb0 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
23fc0 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
23fd0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
23fe0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
23ff0 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
24000 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
24010 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
24020 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
24030 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
24040 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
24050 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
24060 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
24070 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
24080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
24090 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
240a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
240b0 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
240c0 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
240d0 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
240e0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
240f0 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
24100 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
24110 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
24120 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
24130 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
24140 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
24150 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
24160 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
24170 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
24180 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
24190 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
241a0 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
241b0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
241c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
241d0 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
241e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
241f0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
24200 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
24210 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
24220 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
24230 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
24240 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
24250 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
24260 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
24270 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
24280 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
24290 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
242a0 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
242b0 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
242c0 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
242d0 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
242e0 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
242f0 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
24300 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
24310 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
24320 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
24330 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
24340 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
24350 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
24360 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
24370 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
24380 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
24390 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
243a0 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
243b0 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
243c0 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
243d0 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
243e0 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
243f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
24420 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
24430 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
24440 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
24450 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
24460 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
24470 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
24480 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
24490 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
244a0 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
244b0 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
244c0 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
244d0 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
244e0 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
244f0 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
24500 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
24510 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
24520 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
24530 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
24540 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
24550 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
24560 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
24570 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
24580 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
24590 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
245a0 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
245b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
245c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245d0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
245e0 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
245f0 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
24600 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
24610 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
24620 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
24630 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
24640 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
24650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
24660 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
24670 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
24680 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  .){.  pPager->xB
24690 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
246a0 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
246b0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
246c0 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
246d0 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69  lerArg;..  if( i
246e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
246f0 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a  ) ){.    void **
24700 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70  ap = (void **)&p
24710 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
24720 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ler;.    assert(
24730 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a   ((int(*)(void *
24740 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73  ))(ap[0]))==xBus
24750 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20  yHandler );.    
24760 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70  assert( ap[1]==p
24770 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29  BusyHandlerArg )
24780 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
24790 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
247a0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
247b0 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44  E_FCNTL_BUSYHAND
247c0 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29  LER, (void *)ap)
247d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
247e0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
247f0 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
24800 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
24810 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
24820 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
24830 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
24840 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
24850 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
24860 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
24870 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24880 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
24890 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
248a0 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
248b0 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
248c0 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
248d0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
248e0 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f  OERR, an SQLITE_
248f0 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f  IOERR_xxx sub-co
24900 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  de or SQLITE_FUL
24910 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
24920 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
24930 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
24940 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
24950 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
24960 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
24970 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
24980 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
24990 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
249a0 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
249b0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
249c0 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
249d0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
249e0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
249f0 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
24a00 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
24a10 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
24a20 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
24a30 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
24a40 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
24a50 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
24a60 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
24a70 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
24a80 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
24a90 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
24aa0 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
24ab0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
24ac0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
24ad0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
24ae0 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
24af0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
24b00 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
24b10 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
24b20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
24b30 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
24b40 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
24b50 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
24b60 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
24b70 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
24b80 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
24b90 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
24ba0 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
24bb0 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
24bc0 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
24bd0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
24be0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
24bf0 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
24c00 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
24c10 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
24c20 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
24c30 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
24c40 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
24c50 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
24c60 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
24c70 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
24c80 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
24c90 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
24ca0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
24cb0 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
24cc0 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
24cd0 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
24ce0 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
24cf0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
24d00 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
24d10 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
24d20 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
24d30 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65  , u32 *pPageSize
24d40 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
24d50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24d60 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20  TE_OK;..  /* It 
24d70 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
24d80 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73  to do a full ass
24d90 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
24da0 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a  ) here, as this.
24db0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61    ** function ma
24dc0 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  y be called from
24dd0 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65   within PagerOpe
24de0 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20  n(), before the 
24df0 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
24e00 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e Pager object i
24e10 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e  s internally con
24e20 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  sistent..  **.  
24e30 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  ** At one point 
24e40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
24e50 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
24e60 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  if the pager was
24e70 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f   in .  ** PAGER_
24e80 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74  ERROR state. But
24e90 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52   since PAGER_ERR
24ea0 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74  OR state guarant
24eb0 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ees that.  ** th
24ec0 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ere is at least 
24ed0 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
24ee0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20  page reference, 
24ef0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
24f00 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ** is a no-op fo
24f10 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68  r that case anyh
24f20 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20  ow..  */..  u32 
24f30 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
24f40 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
24f50 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
24f60 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
24f70 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
24f80 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
24f90 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  ) );.  if( (pPag
24fa0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
24fb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
24fc0 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  0).   && sqlite3
24fd0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
24fe0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
24ff0 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69  =0 .   && pageSi
25000 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
25010 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
25020 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  eSize .  ){.    
25030 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c  char *pNew = NUL
25040 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  L;             /
25050 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65  * New temp space
25060 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74   */.    i64 nByt
25070 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
25080 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
25090 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f  AGER_OPEN && isO
250a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
250b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
250c0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
250d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79  pPager->fd, &nBy
250e0 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  te);.    }.    i
250f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25100 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
25110 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
25120 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
25130 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
25140 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c  !pNew ) rc = SQL
25150 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
25160 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
25170 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25180 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
25190 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
251a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
251b0 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
251c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
251d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
251e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
251f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25200 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
25210 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
25220 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
25230 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
25240 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ew;.      pPager
25250 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
25260 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
25270 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
25280 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
25290 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
252a0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
252b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
252c0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
252d0 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
252e0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
252f0 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
25300 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25310 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
25320 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
25330 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
25340 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
25350 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
25360 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
25370 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
25380 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
25390 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
253a0 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
253b0 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69     pagerFixMapli
253c0 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
253d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
253e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
253f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
25400 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
25410 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
25420 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
25430 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
25440 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
25450 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
25460 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
25470 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
25480 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
25490 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
254a0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
254b0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
254c0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
254d0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
254e0 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
254f0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
25500 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
25510 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
25520 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
25530 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
25540 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
25550 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
25560 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
25570 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
25580 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
25590 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
255a0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
255b0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
255c0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
255d0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
255e0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
255f0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
25600 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
25610 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
25620 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
25630 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
25640 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
25650 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
25660 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
25670 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
25680 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
25690 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
256a0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
256b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
256c0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
256d0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
256e0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
256f0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
25700 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
25710 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
25720 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25730 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
25740 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
25750 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
25760 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
25770 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25780 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
25790 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
257a0 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
257b0 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
257c0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
257d0 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
257e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
257f0 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
25800 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
25810 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
25820 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
25830 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
25840 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
25850 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
25860 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
25870 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
25880 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
25890 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
258a0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
258b0 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
258c0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
258d0 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
258e0 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
258f0 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
25900 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
25910 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
25920 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
25930 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
25940 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
25950 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
25960 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
25970 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
25980 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
25990 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
259a0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
259b0 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
259c0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
259d0 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
259e0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
259f0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
25a00 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
25a10 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
25a20 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
25a30 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
25a40 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
25a50 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
25a60 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
25a70 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
25a80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
25a90 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
25aa0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
25ab0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
25ac0 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
25ad0 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
25ae0 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
25af0 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
25b00 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
25b10 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
25b20 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
25b30 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
25b40 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
25b50 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
25b60 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
25b70 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
25b80 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
25b90 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
25ba0 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
25bb0 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
25bc0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
25bd0 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
25be0 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
25bf0 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
25c00 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
25c10 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
25c20 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
25c30 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
25c40 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
25c50 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
25c60 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
25c70 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
25c80 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
25c90 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
25ca0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
25cb0 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
25cc0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
25cd0 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
25ce0 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
25cf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25d00 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
25d10 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25d20 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
25d30 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
25d40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25d50 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
25d60 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
25d70 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
25d80 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
25d90 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
25da0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
25db0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
25dc0 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
25dd0 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
25de0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
25df0 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
25e00 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
25e10 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
25e20 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
25e30 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
25e40 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25e50 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
25e60 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
25e70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
25e80 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
25e90 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
25ea0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
25eb0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
25ec0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
25ed0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
25ee0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
25ef0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
25f00 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
25f10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25f20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25f30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25f40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
25f50 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
25f60 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
25f70 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
25f80 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
25f90 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
25fa0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
25fb0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
25fc0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
25fd0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
25fe0 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
25ff0 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
26000 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
26010 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
26020 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
26030 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
26040 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
26050 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
26060 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
26070 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
26080 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
26090 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
260a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
260b0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
260c0 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
260d0 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
260e0 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
260f0 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
26100 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
26110 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
26120 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
26130 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
26140 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
26150 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
26160 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
26170 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
26180 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
26190 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
261a0 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
261b0 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
261c0 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
261d0 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
261e0 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
261f0 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
26200 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
26210 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
26220 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
26230 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
26240 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
26250 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
26260 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
26270 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
26280 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
26290 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
262a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
262b0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
262c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
262d0 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
262e0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
262f0 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
26300 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
26310 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
26320 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
26330 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
26340 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
26350 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26360 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
26370 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
26380 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
26390 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
263c0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
263d0 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
263e0 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
263f0 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
26400 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
26410 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
26420 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  eld), or one of 
26430 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  the transitions 
26440 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
26450 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
26460 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
26470 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
26480 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
26490 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
264a0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
264b0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
264c0 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
264d0 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
264e0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
264f0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
26500 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
26510 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
26520 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
26530 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
26540 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
26550 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
26560 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
26570 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
26580 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
26590 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
265a0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
265b0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
265c0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
265d0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
265e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
265f0 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
26600 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26610 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
26620 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
26630 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
26640 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
26650 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
26660 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
26670 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
26680 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
26690 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
266a0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
266b0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
266c0 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
266d0 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
266e0 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
266f0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
26700 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
26710 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
26720 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
26730 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
26740 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
26750 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
26760 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
26770 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
26780 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
26790 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
267a0 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
267b0 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
267c0 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
267d0 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
267e0 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
267f0 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
26800 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
26810 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
26820 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
26830 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
26840 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
26850 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
26860 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
26870 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
26880 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
26890 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
268a0 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
268b0 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
268c0 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
268d0 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
268e0 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
268f0 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f  rect behavior wo
26900 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
26910 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
26920 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
26930 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
26940 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
26950 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
26960 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
26970 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26980 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
26990 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
269a0 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
269b0 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
269c0 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
269d0 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
269e0 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
269f0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
26a00 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
26a10 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
26a20 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
26a30 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
26a40 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
26a50 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
26a60 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
26a70 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
26a80 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
26a90 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
26aa0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
26ab0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
26ac0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
26ad0 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
26ae0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
26af0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
26b00 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
26b10 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
26b20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
26b30 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
26b40 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26b50 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
26b60 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
26b70 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
26b80 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26b90 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
26ba0 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
26bb0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26bc0 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
26bd0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
26be0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
26bf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
26c00 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
26c10 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
26c20 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
26c30 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
26c40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26c50 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
26c60 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
26c70 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
26c80 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
26c90 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
26ca0 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
26cb0 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
26cc0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
26cd0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
26ce0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
26cf0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
26d00 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
26d10 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
26d20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
26d30 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74   Once this funct
26d40 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ion has been cal
26d50 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63  led, the transac
26d60 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72  tion must either
26d70 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61   be.** rolled ba
26d80 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e  ck or committed.
26d90 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
26da0 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
26db0 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65  ction and.** the
26dc0 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69  n continue writi
26dd0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
26de0 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
26df0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
26e00 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
26e10 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
26e20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
26e30 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
26e40 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
26e50 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
26e60 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
26e70 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
26e80 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
26e90 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70  ;..  /* At one p
26ea0 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65  oint the code he
26eb0 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74  re called assert
26ec0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26ed0 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73  nt() to.  ** ens
26ee0 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ure that all pag
26ef0 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  es being truncat
26f00 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20  ed away by this 
26f10 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20  operation are,. 
26f20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f   ** if one or mo
26f30 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  re savepoints ar
26f40 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20  e open, present 
26f50 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  in the savepoint
26f60 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73   .  ** journal s
26f70 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
26f80 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74  be restored if t
26f90 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
26fa0 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
26fb0 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e  . This is no lon
26fc0 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73  ger necessary as
26fd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26fe0 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20  s now only.  ** 
26ff0 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
27000 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
27010 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
27020 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20   although the . 
27030 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   ** Pager object
27040 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20   may still have 
27050 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
27060 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
27070 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65  t!=0), .  ** the
27080 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  y cannot be roll
27090 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20  ed back. So the 
270a0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
270b0 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a  nstraint() call.
270c0 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65    ** is no longe
270d0 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a  r correct. */.}.
270e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
270f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
27100 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
27110 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
27120 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
27130 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
27140 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
27150 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
27160 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
27170 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
27180 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27190 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
271a0 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
271b0 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
271c0 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
271d0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
271e0 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
271f0 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
27200 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
27210 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
27220 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
27230 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
27240 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
27250 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
27260 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
27270 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
27280 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
27290 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
272a0 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
272b0 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
272c0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
272d0 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
272e0 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
272f0 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
27300 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
27310 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
27320 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
27330 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
27340 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
27350 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
27360 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
27370 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
27380 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
27390 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
273a0 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
273b0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
273c0 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
273d0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
273e0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
273f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
27400 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
27410 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
27420 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
27430 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
27440 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
27450 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
27460 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74  SIZE>0./*.** Obt
27470 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
27480 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70  to a memory mapp
27490 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66  ed page object f
274a0 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  or page number p
274b0 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77  gno. .** The new
274c0 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65   object will use
274d0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61   the pointer pDa
274e0 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ta, obtained fro
274f0 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49  m xFetch()..** I
27500 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
27510 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69  t *ppPage to poi
27520 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
27530 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  ge reference.** 
27540 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
27550 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
27560 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
27570 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
27580 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20   set.** *ppPage 
27590 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50  to zero..**.** P
275a0 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f  age references o
275b0 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69  btained by calli
275c0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
275d0 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61   should be relea
275e0 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e  sed.** by callin
275f0 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  g pagerReleaseMa
27600 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  pPage()..*/.stat
27610 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75  ic int pagerAcqu
27620 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61  ireMapPage(.  Pa
27630 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27650 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
27660 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27680 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
27690 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61  r */.  void *pDa
276a0 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
276b0 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
276c0 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68  ()'d data for th
276d0 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
276e0 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  dr **ppPage     
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27700 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61  OUT: Acquired pa
27710 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ge object */.){.
27720 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27740 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70    /* Memory mapp
27750 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72  ed page to retur
27760 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50  n */.  .  if( pP
27770 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27780 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  ist ){.    *ppPa
27790 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d  ge = p = pPager-
277a0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a  >pMmapFreelist;.
277b0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61      pPager->pMma
277c0 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70  pFreelist = p->p
277d0 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
277e0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  irty = 0;.    as
277f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 45  sert( pPager->nE
27800 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20 6d  xtra>=8 );.    m
27810 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c  emset(p->pExtra,
27820 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65 7b   0, 8);.  }else{
27830 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
27840 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69   = (PgHdr *)sqli
27850 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
27860 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50  zeof(PgHdr) + pP
27870 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
27880 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20     if( p==0 ){. 
27890 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
278a0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
278b0 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20  , (i64)(pgno-1) 
278c0 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
278d0 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  ze, pData);.    
278e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
278f0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
27900 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20  }.    p->pExtra 
27910 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b  = (void *)&p[1];
27920 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
27930 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20  PGHDR_MMAP;.    
27940 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
27950 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61   p->pPager = pPa
27960 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ger;.  }..  asse
27970 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28  rt( p->pExtra==(
27980 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a  void *)&p[1] );.
27990 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
279a0 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
279b0 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48  t( p->flags==PGH
279c0 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73  DR_MMAP );.  ass
279d0 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d  ert( p->pPager==
279e0 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
279f0 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29  rt( p->nRef==1 )
27a00 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70  ;..  p->pgno = p
27a10 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20  gno;.  p->pData 
27a20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65  = pData;.  pPage
27a30 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a  r->nMmapOut++;..
27a40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27a50 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
27a60 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
27a70 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
27a80 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61  pPg. pPg must ha
27a90 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64  ve been returned
27aa0 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69   by an .** earli
27ab0 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  er call to pager
27ac0 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29  AcquireMapPage()
27ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27ae0 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
27af0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
27b00 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
27b10 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
27b20 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
27b30 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44  Out--;.  pPg->pD
27b40 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
27b50 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
27b60 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
27b70 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20  elist = pPg;..  
27b80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27b90 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
27ba0 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73  ersion>=3 );.  s
27bb0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
27bc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
27bd0 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70  )(pPg->pgno-1)*p
27be0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
27bf0 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a   pPg->pData);.}.
27c00 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
27c10 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74  PgHdr objects st
27c20 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65  ored in the Page
27c30 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  r.pMmapFreelist 
27c40 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
27c50 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61  void pagerFreeMa
27c60 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61  pHdrs(Pager *pPa
27c70 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
27c80 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  ;.  PgHdr *pNext
27c90 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
27ca0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
27cb0 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
27cc0 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69    pNext = p->pDi
27cd0 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rty;.    sqlite3
27ce0 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
27cf0 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
27d00 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
27d10 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
27d20 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
27d30 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
27d40 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
27d50 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
27d60 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
27d70 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
27d80 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
27d90 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
27da0 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
27db0 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
27dc0 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
27dd0 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
27de0 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
27df0 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
27e00 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
27e10 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
27e20 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
27e30 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
27e40 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
27e50 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
27e60 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
27e70 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
27e80 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
27e90 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
27ea0 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
27eb0 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
27ec0 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
27ed0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
27ee0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
27ef0 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
27f00 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
27f10 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
27f20 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
27f30 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
27f40 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
27f50 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
27f60 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
27f70 65 72 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29  er, sqlite3 *db)
27f80 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
27f90 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
27fa0 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
27fb0 74 28 20 64 62 20 7c 7c 20 70 61 67 65 72 55 73  t( db || pagerUs
27fc0 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
27fd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
27fe0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
27ff0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73  pPager) );.  dis
28000 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
28010 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
28020 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
28030 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65  Malloc();.  page
28040 72 46 72 65 65 4d 61 70 48 64 72 73 28 70 50 61  rFreeMapHdrs(pPa
28050 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ger);.  /* pPage
28060 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20  r->errCode = 0; 
28070 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  */.  pPager->exc
28080 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
28090 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
280a0 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74  MIT_WAL.  assert
280b0 28 20 64 62 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ( db || pPager->
280c0 70 57 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  pWal==0 );.  sql
280d0 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
280e0 67 65 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70  ger->pWal, db, p
280f0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
28100 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61  lags, pPager->pa
28110 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 28 64  geSize,.      (d
28120 62 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  b && (db->flags 
28130 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f  & SQLITE_NoCkptO
28140 6e 43 6c 6f 73 65 29 20 3f 20 30 20 3a 20 70 54  nClose) ? 0 : pT
28150 6d 70 29 0a 20 20 29 3b 0a 20 20 70 50 61 67 65  mp).  );.  pPage
28160 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e  r->pWal = 0;.#en
28170 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65  dif.  pager_rese
28180 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
28190 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61   MEMDB ){.    pa
281a0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
281b0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
281c0 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65   /* If it is ope
281d0 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n, sync the jour
281e0 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
281f0 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e  calling UnlockAn
28200 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a  dRollback..    *
28210 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
28220 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75   done, then an u
28230 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
28240 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
28250 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  nal .    ** file
28260 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62   may be played b
28270 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
28280 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65  abase. If a powe
28290 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
282a0 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74   .    ** while t
282b0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
282c0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
282d0 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
282e0 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  upt..    **.    
282f0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
28300 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
28310 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a  ng to sync the j
28320 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68  ournal, shift th
28330 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69  e pager.    ** i
28340 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
28350 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73  ate. This causes
28360 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
28370 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ck to unlock the
28380 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
28390 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a   and close the j
283a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68  ournal file with
283b0 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74  out attempting t
283c0 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a  o roll it.    **
283d0 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a   back or finaliz
283e0 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64  e it. The next d
283f0 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c  atabase user wil
28400 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74  l have to do hot
28410 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20  -journal.    ** 
28420 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20  rollback before 
28430 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61  accessing the da
28440 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
28450 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70   */.    if( isOp
28460 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28470 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69  ){.#if 0.      i
28480 66 28 20 70 61 67 65 72 49 73 53 65 72 76 65 72  f( pagerIsServer
28490 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
284a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
284b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
284c0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
284d0 44 45 5f 50 45 52 53 49 53 54 20 29 3b 0a 20 20  DE_PERSIST );.  
284e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
284f0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
28500 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
28510 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 2f 2a  LETE;.        /*
28520 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20 63   If necessary, c
28530 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 20  hange the pager 
28540 73 74 61 74 65 20 73 6f 20 74 68 61 74 20 74 68  state so that th
28550 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
28560 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 64 65          ** is de
28570 6c 65 74 65 64 20 62 79 20 74 68 65 20 63 61 6c  leted by the cal
28580 6c 20 74 6f 20 70 61 67 65 72 55 6e 6c 6f 63 6b  l to pagerUnlock
28590 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  AndRollback() be
285a0 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  low.  */.       
285b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
285c0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
285d0 29 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ) pPager->eState
285e0 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
285f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
28600 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
28610 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53  r(pPager, pagerS
28620 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
28630 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
28640 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
28650 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
28660 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
28670 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49  ITE_SERVER_EDITI
28680 4f 4e 0a 20 20 69 66 28 20 70 61 67 65 72 49 73  ON.  if( pagerIs
28690 53 65 72 76 65 72 28 70 50 61 67 65 72 29 20 29  Server(pPager) )
286a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 72  {.    sqlite3Ser
286b0 76 65 72 44 69 73 63 6f 6e 6e 65 63 74 28 70 50  verDisconnect(pP
286c0 61 67 65 72 2d 3e 70 53 65 72 76 65 72 2c 20 70  ager->pServer, p
286d0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
286e0 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 20  pPager->pServer 
286f0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
28700 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
28710 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
28720 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
28730 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
28740 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
28750 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
28760 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
28770 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
28780 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
28790 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
287a0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
287b0 61 67 65 72 29 29 3b 0a 20 20 73 71 6c 69 74 65  ager));.  sqlite
287c0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
287d0 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  >fd);.  sqlite3P
287e0 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20  ageFree(pTmp);. 
287f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
28800 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ose(pPager->pPCa
28810 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  che);..#ifdef SQ
28820 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
28830 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
28840 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
28850 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
28860 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65  ger->pCodec);.#e
28870 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
28880 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  !pPager->aSavepo
28890 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  int && !pPager->
288a0 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
288b0 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
288c0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b  pPager->sjfd) );
288d0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
288e0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
288f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
28900 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
28910 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
28920 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
28930 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
28940 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
28950 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f  age pPg..*/.Pgno
28960 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
28970 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
28980 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
28990 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64  Pg->pgno;.}.#end
289a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
289b0 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
289c0 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65  e count for page
289d0 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   pPg..*/.void sq
289e0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
289f0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71  Page *pPg){.  sq
28a00 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70  lite3PcacheRef(p
28a10 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  Pg);.}../*.** Sy
28a20 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
28a30 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
28a40 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
28a50 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
28a60 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
28a70 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
28a80 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
28a90 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
28aa0 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
28ab0 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73  k and can be res
28ac0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  tored in the eve
28ad0 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  nt of a hot-jour
28ae0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  nal rollback..**
28af0 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72  .** If the Pager
28b00 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20  .noSync flag is 
28b10 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  set, then this f
28b20 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
28b30 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
28b40 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65  , the actions re
28b50 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e  quired depend on
28b60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
28b70 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65  e and the .** de
28b80 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
28b90 74 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65  tics of the file
28ba0 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
28bb0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
28bc0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
28bd0 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
28be0 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
28bf0 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
28c00 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
28c10 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
28c20 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
28c30 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
28c40 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
28c50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
28c60 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
28c70 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
28c80 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
28c90 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
28ca0 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
28cb0 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
28cc0 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
28cd0 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
28ce0 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
28cf0 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
28d00 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
28d10 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
28d20 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
28d30 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
28d40 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
28d50 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
28d60 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
28d70 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
28d80 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
28d90 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
28da0 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
28db0 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
28dc0 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
28dd0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
28de0 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
28df0 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
28e00 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
28e10 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
28e20 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
28e30 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
28e40 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
28e50 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
28e60 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
28e70 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
28e80 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
28e90 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
28ea0 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
28eb0 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
28ec0 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
28ed0 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
28ee0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
28ef0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
28f00 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f  lears the PGHDR_
28f10 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
28f20 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65  f every .** page
28f30 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
28f40 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65  in memory before
28f50 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
28f60 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a  E_OK. If an IO.*
28f70 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  * error is encou
28f80 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65  ntered, then the
28f90 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
28fa0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
28fb0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
28fc0 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
28fd0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
28fe0 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a  r, int newHdr){.
28ff0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29010 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
29020 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
29030 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
29040 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
29050 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
29060 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
29070 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
29080 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
29090 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
290a0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
290b0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
290c0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
290d0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
290e0 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
290f0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
29100 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29110 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
29120 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
29130 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
29140 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
29150 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
29160 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
29170 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
29180 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
29190 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
291a0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f  MORY ){.      co
291b0 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71  nst int iDc = sq
291c0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
291d0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
291e0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
291f0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
29200 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
29210 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
29220 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
29230 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
29240 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
29250 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
29260 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c  an obscure probl
29270 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20  em. If the last 
29280 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
29290 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
292a0 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
292b0 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20  e was operating 
292c0 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f  in persistent-jo
292d0 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
292e0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
292f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
29300 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61   at this point a
29310 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65  ctually be large
29320 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  r.        ** tha
29330 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  n Pager.journalO
29340 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65  ff bytes. If the
29350 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74   next thing in t
29360 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
29370 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65     ** file happe
29380 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  ns to be a journ
29390 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74  al-header (writt
293a0 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
293b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
293c0 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  vious connection
293d0 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  's transaction),
293e0 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20   and a crash or 
293f0 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20  power-failure . 
29400 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73         ** occurs
29410 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75   after nRec is u
29420 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  pdated but befor
29430 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
29440 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20  n writes .      
29450 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c    ** anything el
29460 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  se to the journa
29470 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69  l file (or commi
29480 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74  ts/rolls back it
29490 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  s .        ** tr
294a0 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e  ansaction), then
294b0 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f   SQLite may beco
294c0 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e  me confused when
294d0 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20   doing the .    
294e0 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
294f0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  al rollback foll
29500 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20  owing recovery. 
29510 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b  It may roll back
29520 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
29530 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
29540 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70  ons data, then p
29550 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e  roceed to rollin
29560 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a  g back the old,.
29570 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f          ** out-o
29580 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74  f-date data that
29590 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74   follows it. Dat
295a0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
295b0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
295c0 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20       ** To work 
295d0 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
295e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
295f0 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20   does appear to 
29600 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20  contain.        
29610 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65  ** a valid heade
29620 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65  r following Page
29630 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68  r.journalOff, th
29640 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a  en write a 0x00.
29650 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20          ** byte 
29660 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
29670 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  it to prevent it
29680 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f   from being reco
29690 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20  gnized..        
296a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61  **.        ** Va
296b0 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f  riable iNextHdrO
296c0 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20  ffset is set to 
296d0 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68  the offset at wh
296e0 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20  ich this.       
296f0 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20   ** problematic 
29700 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75  header will occu
29710 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  r, if it exists.
29720 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20   aMagic is used 
29730 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61  .        ** as a
29740 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
29750 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65  r to inspect the
29760 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66   first couple of
29770 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20   bytes of.      
29780 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69    ** the potenti
29790 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  al journal heade
297a0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
297b0 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48        i64 iNextH
297c0 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  drOffset;.      
297d0 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a    u8 aMagic[8];.
297e0 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64          u8 zHead
297f0 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
29800 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20  alMagic)+4];..  
29810 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65        memcpy(zHe
29820 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
29830 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
29840 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
29850 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26       put32bits(&
29860 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
29870 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
29880 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
29890 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
298a0 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
298b0 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
298c0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
298d0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
298e0 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
298f0 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
29900 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
29910 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29920 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
29930 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
29940 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
29950 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
29960 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
29970 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
29980 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
29990 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
299a0 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
299b0 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
299c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
299d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
299e0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
299f0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
29a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
29a10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
29a20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
29a30 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
29a40 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
29a50 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
29a60 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
29a70 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
29a80 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
29a90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
29aa0 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
29ab0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
29ac0 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
29ad0 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
29ae0 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
29af0 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
29b00 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
29b10 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
29b20 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
29b30 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
29b40 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
29b50 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
29b60 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
29b70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
29b80 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
29b90 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
29ba0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
29bb0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
29bc0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
29bd0 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
29be0 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
29bf0 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
29c00 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
29c10 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
29c20 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
29c30 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
29c40 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
29c50 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
29c60 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
29c70 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
29c80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29c90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
29ca0 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
29cb0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
29cc0 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
29cd0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
29ce0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
29cf0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
29d00 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
29d10 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
29d20 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
29d30 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
29d40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29d50 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
29d60 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
29d70 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
29d80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29d90 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
29da0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29db0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
29dc0 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
29dd0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
29de0 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20  rnalHdr));.     
29df0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29e00 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20  sWrite(.        
29e10 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c      pPager->jfd,
29e20 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
29e30 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65  (zHeader), pPage
29e40 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20  r->journalHdr.  
29e50 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29e60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29e70 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
29e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29e90 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
29ea0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
29eb0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
29ec0 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
29ed0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
29ee0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
29ef0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
29f00 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
29f10 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
29f20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29f30 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
29f40 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
29f50 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  cFlags| .       
29f60 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
29f70 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  Flags==SQLITE_SY
29f80 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
29f90 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
29fa0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
29fb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29fc0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
29fd0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
29fe0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
29ff0 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
2a000 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20  urnalOff;.      
2a010 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d  if( newHdr && 0=
2a020 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
2a030 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
2a040 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2a050 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
2a060 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
2a070 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
2a080 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2a090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a0a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a0b0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2a0c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2a0d0 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
2a0e0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
2a0f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65  }.  }..  /* Unle
2a100 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
2a110 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20  in noSync mode, 
2a120 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2a130 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20   was just .  ** 
2a140 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e  successfully syn
2a150 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ced. Either way,
2a160 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
2a170 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
2a180 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67  on .  ** all pag
2a190 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
2a1a0 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e  e3PcacheClearSyn
2a1b0 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  cFlags(pPager->p
2a1c0 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65  PCache);.  pPage
2a1d0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2a1e0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a  R_WRITER_DBMOD;.
2a1f0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
2a200 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
2a210 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
2a220 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2a230 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
2a240 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  t is the first i
2a250 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
2a260 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63  of dirty pages c
2a270 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74  onnected.** by t
2a280 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
2a290 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75  pointer. This fu
2a2a0 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61  nction writes ea
2a2b0 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  ch one of the.**
2a2c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
2a2d0 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20   in the list to 
2a2e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a2f0 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
2a300 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20  may.** be NULL, 
2a310 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
2a320 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74  empty list. In t
2a330 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75  his case this fu
2a340 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e  nction is.** a n
2a350 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
2a360 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  pager must hold 
2a370 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
2a380 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68  VED lock when th
2a390 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
2a3a0 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65  s called. Before
2a3b0 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e   writing anythin
2a3c0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
2a3d0 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63  e file, this loc
2a3e0 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64  k.** is upgraded
2a3f0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
2a400 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
2a410 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
2a420 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  ained,.** SQLITE
2a430 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
2a440 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73  d and no data is
2a450 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2a460 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2a470 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  * .** If the pag
2a480 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  er is a temp-fil
2a490 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20  e pager and the 
2a4a0 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74  actual file-syst
2a4b0 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f  em file.** is no
2a4c0 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69  t yet open, it i
2a4d0 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70  s created and op
2a4e0 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ened before any 
2a4f0 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74  data is .** writ
2a500 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ten out..**.** O
2a510 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  nce the lock has
2a520 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61   been upgraded a
2a530 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
2a540 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  , the file opene
2a550 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20  d,.** the pages 
2a560 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20  are written out 
2a570 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2a580 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64  file in list ord
2a590 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61  er. Writing.** a
2a5a0 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64   page is skipped
2a5b0 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74   if it meets eit
2a5c0 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
2a5d0 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a  wing criteria:.*
2a5e0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
2a5f0 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  e number is grea
2a600 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64  ter than Pager.d
2a610 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a  bSize, or.**   *
2a620 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   The PGHDR_DONT_
2a630 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65  WRITE flag is se
2a640 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
2a650 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20  *.** If writing 
2a660 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65  out a page cause
2a670 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
2a680 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67  ile to grow, Pag
2a690 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  er.dbFileSize.**
2a6a0 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f   is updated acco
2a6b0 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65  rdingly. If page
2a6c0 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75   1 is written ou
2a6d0 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
2a6e0 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50  e cached.** in P
2a6f0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
2a700 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  ] is updated to 
2a710 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61  match the new va
2a720 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
2a730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a740 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
2a750 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2a760 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
2a770 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
2a780 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
2a790 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
2a7a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2a7b0 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
2a7c0 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
2a7d0 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62   cannot.** be ob
2a7e0 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42  tained, SQLITE_B
2a7f0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
2a800 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2a810 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2a820 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ist(Pager *pPage
2a830 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29  r, PgHdr *pList)
2a840 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2a850 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2a860 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2a870 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
2a880 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2a890 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  s only called fo
2a8a0 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72  r rollback pager
2a8b0 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f  s in WRITER_DBMO
2a8c0 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73  D state. */.  as
2a8d0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
2a8e0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
2a8f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a900 74 65 6d 70 46 69 6c 65 20 7c 7c 20 70 50 61 67  tempFile || pPag
2a910 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2a920 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
2a930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2a940 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
2a950 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  SIVE_LOCK );.  a
2a960 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2a970 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 4c 69  ager->fd) || pLi
2a980 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 29 3b  st->pDirty==0 );
2a990 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2a9a0 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20  SERVER_EDITION. 
2a9b0 20 69 66 28 20 70 61 67 65 72 49 73 53 65 72 76   if( pagerIsServ
2a9c0 65 72 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  er(pPager) ){.  
2a9d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
2a9e0 72 76 65 72 50 72 65 43 6f 6d 6d 69 74 28 70 50  rverPreCommit(pP
2a9f0 61 67 65 72 2d 3e 70 53 65 72 76 65 72 2c 20 70  ager->pServer, p
2aa00 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 50 61  Pager->pServerPa
2aa10 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ge);.    pPager-
2aa20 3e 70 53 65 72 76 65 72 50 61 67 65 20 3d 20 30  >pServerPage = 0
2aa30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2aa40 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
2aa50 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
2aa60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
2aa70 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
2aa80 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
2aa90 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
2aaa0 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
2aab0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
2aac0 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
2aad0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
2aae0 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
2aaf0 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
2ab00 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
2ab10 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
2ab20 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
2ab30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
2ab40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2ab50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2ab60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2ab70 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2ab80 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
2ab90 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
2aba0 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
2abb0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
2abc0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66  );.  }..  /* Bef
2abd0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72  ore the first wr
2abe0 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46  ite, give the VF
2abf0 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74  S a hint of what
2ac00 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20   the final.  ** 
2ac10 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62  file size will b
2ac20 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
2ac30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ac40 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
2ac50 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72  ->fd) );.  if( r
2ac60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
2ac70 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69   && pPager->dbHi
2ac80 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  ntSize<pPager->d
2ac90 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69  bSize.   && (pLi
2aca0 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c  st->pDirty || pL
2acb0 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  ist->pgno>pPager
2acc0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20  ->dbHintSize).  
2acd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
2ace0 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50  nt64 szFile = pP
2acf0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a  ager->pageSize *
2ad00 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
2ad10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
2ad20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
2ad30 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
2ad40 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
2ad50 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
2ad60 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70   &szFile);.    p
2ad70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
2ad80 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
2ad90 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ze;.  }..  while
2ada0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2adb0 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
2adc0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
2add0 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
2ade0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
2adf0 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
2ae00 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
2ae10 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
2ae20 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
2ae30 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
2ae40 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
2ae50 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
2ae60 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
2ae70 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
2ae80 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
2ae90 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
2aea0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
2aeb0 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
2aec0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
2aed0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
2aee0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
2aef0 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
2af00 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
2af10 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
2af20 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
2af30 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
2af40 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
2af50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
2af60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2af70 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
2af80 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
2af90 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
2afa0 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
2afb0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
2afc0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
2afd0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2afe0 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
2aff0 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
2b000 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
2b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b030 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
2b040 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73  */    ..      as
2b050 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c  sert( (pList->fl
2b060 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2b070 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
2b080 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
2b090 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
2b0a0 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
2b0b0 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pList);..      /
2b0c0 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74  * Encode the dat
2b0d0 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
2b0e0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
2b0f0 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  ist->pData, pgno
2b100 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 6, return SQLI
2b110 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70  TE_NOMEM_BKPT, p
2b120 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
2b130 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70   Write out the p
2b140 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  age data. */.   
2b150 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2b160 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
2b170 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
2b180 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
2b190 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  et);..      /* I
2b1a0 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
2b1b0 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
2b1c0 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
2b1d0 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
2b1e0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
2b1f0 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
2b200 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2b210 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
2b220 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
2b230 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
2b240 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
2b250 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
2b260 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
2b270 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
2b280 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
2b290 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
2b2a0 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
2b2b0 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
2b2c0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
2b2d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2b2e0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
2b2f0 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
2b300 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
2b310 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
2b320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
2b330 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
2b340 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b  R_STAT_WRITE]++;
2b350 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
2b360 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a  e any backup obj
2b370 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65  ects copying the
2b380 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
2b390 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20  s pager. */.    
2b3a0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
2b3b0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
2b3c0 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
2b3d0 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b  *)pList->pData);
2b3e0 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ..      PAGERTRA
2b3f0 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE(("STORE %d pa
2b400 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
2b410 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2b420 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
2b430 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
2b440 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
2b450 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f  ist)));.      IO
2b460 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
2b470 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
2b480 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
2b490 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
2b4a0 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
2b4b0 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ount);.    }else
2b4c0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
2b4d0 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
2b4e0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2b4f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
2b500 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  o));.    }.    p
2b510 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
2b520 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c  h(pList);.    pL
2b530 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
2b540 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
2b550 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b560 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
2b570 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
2b580 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20   is open. If it 
2b590 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
2b5a0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
2b5b0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
2b5c0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2b5d0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
2b5e0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
2b5f0 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
2b600 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   An .** SQLITE_I
2b610 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
2b620 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2b630 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  if a call to sql
2b640 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a  ite3OsOpen() .**
2b650 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b660 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
2b670 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
2b680 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
2b690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
2b6a0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2b6b0 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 63 6f  >sjfd) ){.    co
2b6c0 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
2b6d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
2b6e0 4a 4f 55 52 4e 41 4c 20 7c 20 53 51 4c 49 54 45  JOURNAL | SQLITE
2b6f0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
2b700 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f  .      | SQLITE_
2b710 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51  OPEN_CREATE | SQ
2b720 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
2b730 49 56 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c  IVE .      | SQL
2b740 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
2b750 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 69 6e 74 20  NCLOSE;.    int 
2b760 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 73 71 6c  nStmtSpill = sql
2b770 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74  ite3Config.nStmt
2b780 53 70 69 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70  Spill;.    if( p
2b790 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2b7a0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2b7b0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
2b7c0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
2b7d0 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 6e 53  mory ){.      nS
2b7e0 74 6d 74 53 70 69 6c 6c 20 3d 20 2d 31 3b 0a 20  tmtSpill = -1;. 
2b7f0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
2b800 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
2b810 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
2b820 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
2b830 66 6c 61 67 73 2c 20 6e 53 74 6d 74 53 70 69 6c  flags, nStmtSpil
2b840 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  l);.  }.  return
2b850 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   rc;.}../*.** Ap
2b860 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66  pend a record of
2b870 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
2b880 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74  te of page pPg t
2b890 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2b8a0 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  l. .**.** If suc
2b8b0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
2b8c0 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
2b8d0 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20  ng to pPg->pgno 
2b8e0 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a  in the bitvecs.*
2b8f0 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73  * for all open s
2b900 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65  avepoints before
2b910 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
2b920 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2b930 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
2b940 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
2b950 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
2b960 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  n IO.** error co
2b970 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  de if the attemp
2b980 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
2b990 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61  e sub-journal fa
2b9a0 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49  ils, or .** SQLI
2b9b0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
2b9c0 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65  lloc fails while
2b9d0 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69   setting a bit i
2b9e0 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  n a savepoint.**
2b9f0 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74   bitvec..*/.stat
2ba00 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
2ba10 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  lPage(PgHdr *pPg
2ba20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2ba30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
2ba40 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2ba50 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
2ba60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2ba70 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
2ba80 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20  MODE_OFF ){..   
2ba90 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
2baa0 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
2bab0 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
2bac0 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  been opened */. 
2bad0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2bae0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
2baf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
2bb00 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2bb10 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28   || pagerUseWal(
2bb20 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61  pPager) );.    a
2bb30 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2bb40 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70  ager->sjfd) || p
2bb50 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d  Pager->nSubRec==
2bb60 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2bb70 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2bb80 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ger) .         |
2bb90 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  | pageInJournal(
2bba0 70 50 61 67 65 72 2c 20 70 50 67 29 20 0a 20 20  pPager, pPg) .  
2bbb0 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70         || pPg->p
2bbc0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
2bbd0 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20  igSize .    );. 
2bbe0 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a     rc = openSubJ
2bbf0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2bc00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
2bc10 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f  ub-journal was o
2bc20 70 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  pened successful
2bc30 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61  ly (or was alrea
2bc40 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a  dy open),.    **
2bc50 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e   write the journ
2bc60 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  al record into t
2bc70 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  he file.  */.   
2bc80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bc90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  OK ){.      void
2bca0 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
2bcb0 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20  Data;.      i64 
2bcc0 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 50  offset = (i64)pP
2bcd0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34  ager->nSubRec*(4
2bce0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
2bcf0 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e);.      char *
2bd00 70 44 61 74 61 32 3b 0a 0a 23 69 66 20 53 51 4c  pData2;..#if SQL
2bd10 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 20 20  ITE_HAS_CODEC   
2bd20 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
2bd30 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
2bd40 20 29 7b 0a 20 20 20 20 20 20 20 20 43 4f 44 45   ){.        CODE
2bd50 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
2bd60 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
2bd70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2bd80 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32  MEM_BKPT, pData2
2bd90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
2bda0 65 6e 64 69 66 0a 20 20 20 20 20 20 70 44 61 74  endif.      pDat
2bdb0 61 32 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  a2 = pData;.    
2bdc0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2bdd0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
2bde0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2bdf0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2be00 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
2be10 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
2be20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
2be30 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
2be40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2be50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2be60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2be70 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2be80 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
2be90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2bea0 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
2beb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2bec0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bed0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
2bee0 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
2bef0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2bf00 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
2bf10 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
2bf20 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
2bf30 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2bf40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2bf50 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
2bf60 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49   subjournalPageI
2bf70 66 52 65 71 75 69 72 65 64 28 50 67 48 64 72 20  fRequired(PgHdr 
2bf80 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62  *pPg){.  if( sub
2bf90 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
2bfa0 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
2bfb0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2bfc0 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pPg);.  }else{. 
2bfd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bfe0 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
2bff0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2c000 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
2c010 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
2c020 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
2c030 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
2c040 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
2c050 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
2c060 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2c070 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
2c080 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
2c090 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
2c0a0 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
2c0b0 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
2c0c0 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
2c0d0 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
2c0e0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
2c0f0 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
2c100 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
2c110 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
2c120 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
2c130 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
2c140 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
2c150 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
2c160 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
2c170 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
2c180 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
2c190 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
2c1a0 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
2c1b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
2c1c0 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
2c1d0 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
2c1e0 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
2c1f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c200 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
2c210 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
2c220 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
2c230 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
2c240 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2c250 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
2c260 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
2c270 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
2c280 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
2c290 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2c2a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2c2b0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2c2c0 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
2c2d0 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
2c2e0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2c2f0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
2c300 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
2c310 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
2c320 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
2c330 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
2c340 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
2c350 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2c360 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2c370 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2c380 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
2c390 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2c3a0 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
2c3b0 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
2c3c0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
2c3d0 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
2c3e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2c3f0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
2c400 61 67 65 72 49 73 53 65 72 76 65 72 28 70 50 61  agerIsServer(pPa
2c410 67 65 72 29 20 29 20 72 65 74 75 72 6e 20 53 51  ger) ) return SQ
2c420 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
2c430 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
2c440 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
2c450 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
2c460 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a  PGHDR_DIRTY );..
2c470 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    /* The doNotSp
2c480 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69  ill NOSYNC bit i
2c490 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d  s set during tim
2c4a0 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  es when doing a 
2c4b0 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75  sync of.  ** jou
2c4c0 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67  rnal (and adding
2c4d0 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69   a new header) i
2c4e0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20  s not allowed.  
2c4f0 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a  This occurs.  **
2c500 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f   during calls to
2c510 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2c520 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e  te() while tryin
2c530 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c  g to journal mul
2c540 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73  tiple.  ** pages
2c550 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68   belonging to th
2c560 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20  e same sector.. 
2c570 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e   **.  ** The doN
2c580 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b  otSpill ROLLBACK
2c590 20 61 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e   and OFF bits in
2c5a0 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65  hibits all cache
2c5b0 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72   spilling.  ** r
2c5c0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2c5d0 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79  ther or not a sy
2c5e0 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
2c5f0 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72   This is set dur
2c600 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62  ing.  ** a rollb
2c610 61 63 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72  ack or by user r
2c620 65 71 75 65 73 74 2c 20 72 65 73 70 65 63 74 69  equest, respecti
2c630 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  vely..  **.  ** 
2c640 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f  Spilling is also
2c650 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e   prohibited when
2c660 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
2c670 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f  te since that co
2c680 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f  uld.  ** lead to
2c690 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
2c6a0 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63  tion.   In the c
2c6b0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
2c6c0 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69  ation it .  ** i
2c6d0 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72  s impossible for
2c6e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
2c6f0 74 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c  tch() to be call
2c700 65 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c  ed with createFl
2c710 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65  ag==3.  ** while
2c720 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2c730 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73  ate, hence it is
2c740 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
2c750 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a  this routine to.
2c760 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69    ** be called i
2c770 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2c780 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  e.  Nevertheless
2c790 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e  , we include a N
2c7a0 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74  EVER().  ** test
2c7b0 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73   for the error s
2c7c0 74 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75  tate as a safegu
2c7d0 61 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75  ard against futu
2c7e0 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f  re changes..  */
2c7f0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2c800 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
2c810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c820 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2c830 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2c840 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
2c850 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63  LBACK );.  testc
2c860 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2c870 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2c880 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73  LAG_OFF );.  tes
2c890 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2c8a0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2c8b0 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a  LFLAG_NOSYNC );.
2c8c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
2c8d0 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28  NotSpill.   && (
2c8e0 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
2c8f0 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47  ill & (SPILLFLAG
2c900 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46  _ROLLBACK|SPILLF
2c910 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20  LAG_OFF))!=0.   
2c920 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67     || (pPg->flag
2c930 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
2c940 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20  YNC)!=0).  ){.  
2c950 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c960 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e  OK;.  }..  pPg->
2c970 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66  pDirty = 0;.  if
2c980 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2c990 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
2c9a0 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66  Write a single f
2c9b0 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61  rame for this pa
2c9c0 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a  ge to the log. *
2c9d0 2f 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  /.    rc = subjo
2c9e0 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69  urnalPageIfRequi
2c9f0 72 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69  red(pPg); .    i
2ca00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ca10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2ca20 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
2ca30 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29  ager, pPg, 0, 0)
2ca40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2ca50 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  .  .    /* Sync 
2ca60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2ca70 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2ca80 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
2ca90 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2caa0 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61  YNC .     || pPa
2cab0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2cac0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
2cad0 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  OD.    ){.      
2cae0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
2caf0 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
2cb00 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69   }.  .    /* Wri
2cb10 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2cb20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  of the page out 
2cb30 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2cb40 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
2cb50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cb60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2cb70 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2cb80 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
2cb90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
2cba0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
2cbb0 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  st(pPager, pPg);
2cbc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2cbd0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
2cbe0 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66  s clean. */.  if
2cbf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cc00 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
2cc10 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61  E(("STRESS %d pa
2cc20 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2cc30 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2cc40 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  pgno));.    sqli
2cc50 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2cc60 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  an(pPg);.  }..  
2cc70 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
2cc80 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20  or(pPager, rc); 
2cc90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
2cca0 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64  all unreferenced
2ccb0 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
2ccc0 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
2ccd0 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 50  ite3PagerFlush(P
2cce0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2ccf0 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72   int rc = pPager
2cd00 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28  ->errCode;.  if(
2cd10 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50   !MEMDB ){.    P
2cd20 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71  gHdr *pList = sq
2cd30 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
2cd40 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
2cd50 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ache);.    asser
2cd60 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
2cd70 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
2cd80 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
2cd90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
2cda0 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  st ){.      PgHd
2cdb0 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
2cdc0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20  ->pDirty;.      
2cdd0 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d  if( pList->nRef=
2cde0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2cdf0 20 3d 20 70 61 67 65 72 53 74 72 65 73 73 28 28   = pagerStress((
2ce00 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c  void*)pPager, pL
2ce10 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
2ce20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
2ce30 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2ce40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ce50 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
2ce60 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
2ce70 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
2ce80 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
2ce90 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
2cea0 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
2ceb0 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
2cec0 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
2ced0 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
2cee0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
2cef0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
2cf00 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
2cf10 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
2cf20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cf30 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
2cf40 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
2cf50 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
2cf60 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
2cf70 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
2cf80 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
2cf90 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
2cfa0 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
2cfb0 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
2cfc0 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
2cfd0 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
2cfe0 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
2cff0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2d000 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
2d010 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
2d020 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
2d030 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
2d040 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
2d050 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
2d060 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2d070 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
2d080 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
2d090 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
2d0a0 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
2d0b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2d0c0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
2d0d0 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
2d0e0 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
2d0f0 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
2d100 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
2d110 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
2d120 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
2d130 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
2d140 20 41 50 49 2e 20 20 57 68 65 6e 20 61 20 6e 65   API.  When a ne
2d150 77 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61  w page is alloca
2d160 74 65 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72 73  ted, the.** firs
2d170 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 69  t 8 bytes of thi
2d180 73 20 73 70 61 63 65 20 61 72 65 20 7a 65 72 6f  s space are zero
2d190 65 64 20 62 75 74 20 74 68 65 20 72 65 6d 61 69  ed but the remai
2d1a0 6e 64 65 72 20 69 73 20 75 6e 69 6e 69 74 69 61  nder is uninitia
2d1b0 6c 69 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20 65  lized..** (The e
2d1c0 78 74 72 61 20 73 70 61 63 65 20 69 73 20 75 73  xtra space is us
2d1d0 65 64 20 62 79 20 62 74 72 65 65 20 61 73 20 74  ed by btree as t
2d1e0 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
2d1f0 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  t.).**.** The fl
2d200 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
2d210 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
2d220 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
2d230 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
2d240 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
2d250 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
2d260 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
2d270 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
2d280 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
2d290 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  ER_* flags..**.*
2d2a0 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
2d2b0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
2d2c0 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
2d2d0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2d2e0 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
2d2f0 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
2d300 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
2d310 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
2d320 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
2d330 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2d340 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2d350 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
2d360 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
2d370 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
2d380 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2d390 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
2d3a0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2d3b0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
2d3c0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
2d3d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2d3e0 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
2d3f0 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
2d400 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
2d410 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2d420 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2d430 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
2d440 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
2d450 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
2d460 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
2d470 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
2d480 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
2d490 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
2d4a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2d4b0 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
2d4c0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2d4d0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2d4e0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2d4f0 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2d500 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2d510 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2d520 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2d530 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2d540 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2d550 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2d560 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d570 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2d580 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2d590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2d5a0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2d5b0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2d5c0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2d5d0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2d5e0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2d5f0 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2d600 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2d610 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2d620 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2d630 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2d640 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2d650 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2d660 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2d670 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2d680 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2d690 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2d6a0 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2d6b0 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2d6c0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2d6d0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2d6e0 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2d6f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2d700 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2d710 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2d720 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2d730 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2d740 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2d750 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2d760 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2d770 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2d780 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2d790 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2d7a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
2d7b0 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2d7c0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2d7d0 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2d7e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2d7f0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2d800 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2d810 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2d820 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2d830 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2d840 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2d850 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2d860 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2d870 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2d880 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d890 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2d8a0 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2d8b0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2d8c0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2d8d0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2d8e0 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2d8f0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70  urnal */.  int p
2d900 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
2d910 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
2d920 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2d930 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2d940 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20  PCache */.  u32 
2d950 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2d960 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2d970 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
2d980 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
2d990 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
2d9a0 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52  ri = 0;    /* UR
2d9b0 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a  I args to copy *
2d9c0 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30  /.  int nUri = 0
2d9d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2d9e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2d9f0 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a  of URI args at *
2da00 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  zUri */..  /* Fi
2da10 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
2da20 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
2da30 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
2da40 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
2da50 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
2da60 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
2da70 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
2da80 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
2da90 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e  al).  */.  journ
2daa0 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2dab0 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
2dac0 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a  alSize(pVfs));..
2dad0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
2dae0 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
2daf0 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
2db00 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
2db10 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
2db20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2db30 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
2db40 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47   if( flags & PAG
2db50 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  ER_MEMORY ){.   
2db60 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
2db70 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2db80 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2db90 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
2dba0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2dbb0 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  up(0, zFilename)
2dbc0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74  ;.      if( zPat
2dbd0 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75  hname==0  ) retu
2dbe0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2dbf0 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74  BKPT;.      nPat
2dc00 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2dc10 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2dc20 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  e);.      zFilen
2dc30 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
2dc40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2dc50 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
2dc60 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
2dc70 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
2dc80 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
2dc90 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
2dca0 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
2dcb0 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
2dcc0 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
2dcd0 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
2dce0 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
2dcf0 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
2dd00 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
2dd10 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2dd20 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2dd30 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  0] ){.    const 
2dd40 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61  char *z;.    nPa
2dd50 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
2dd60 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
2dd70 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2dd80 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2dd90 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  0, nPathname*2);
2dda0 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
2ddb0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
2ddc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2ddd0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
2dde0 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
2ddf0 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
2de00 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
2de10 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
2de20 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
2de30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2de40 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2de50 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
2de60 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
2de70 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
2de80 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2de90 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2dea0 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20  .    z = zUri = 
2deb0 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74  &zFilename[sqlit
2dec0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2ded0 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  name)+1];.    wh
2dee0 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
2def0 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2df00 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2df10 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2df20 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2df30 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69   }.    nUri = (i
2df40 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  nt)(&z[1] - zUri
2df50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2df60 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Uri>=0 );.    if
2df70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2df80 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70  && nPathname+8>p
2df90 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2dfa0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2dfb0 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2dfc0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2dfd0 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20  l path required 
2dfe0 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  by.      ** the 
2dff0 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f  database being o
2e000 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f  pened will be mo
2e010 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78  re than pVfs->mx
2e020 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a  Pathname.      *
2e030 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  * bytes in lengt
2e040 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  h. This means th
2e050 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
2e060 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20  t be opened,.   
2e070 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c     ** as it will
2e080 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2e090 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2e0a0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65  rnal file or eve
2e0b0 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b  n.      ** check
2e0c0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2e0d0 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  al before readin
2e0e0 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
2e0f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2e100 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2e110 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2e120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e130 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2e140 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2e150 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2e160 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2e170 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2e180 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2e190 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2e1a0 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2e1b0 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2e1c0 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2e1d0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2e1e0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2e1f0 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2e200 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2e210 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2e220 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2e230 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e250 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2e260 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2e270 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e290 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2e2a0 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2e2b0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2e2c0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2e2d0 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2e2e0 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2e2f0 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2e300 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2e310 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2e320 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2e330 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2e340 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2e350 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2e360 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2e370 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2e380 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2e390 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2e3a0 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2e3b0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2e3c0 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2e3d0 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2e3e0 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2e3f0 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2e400 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2e410 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2e420 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2e430 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2e440 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2e450 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2e460 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2e470 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2e480 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2e490 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2e4a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2e4b0 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2e4c0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2e4d0 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2e4e0 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2e4f0 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2e500 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2e510 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2e520 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2e530 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2e540 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  8 + 2           
2e550 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2e560 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2e570 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2e580 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2e590 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2            /* 
2e5a0 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2e5b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2e5c0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2e5d0 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2e5e0 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2e5f0 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2e600 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2e610 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2e620 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2e630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2e640 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  M_BKPT;.  }.  pP
2e650 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20  ager =          
2e660 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74      (Pager*)(pPt
2e670 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50  r);.  pPager->pP
2e680 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63  Cache =    (PCac
2e690 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  he*)(pPtr += ROU
2e6a0 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2e6b0 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  er)));.  pPager-
2e6c0 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33  >fd =   (sqlite3
2e6d0 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2e6e0 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2e6f0 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  e));.  pPager->s
2e700 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
2e710 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2e720 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2e730 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile));.  pPager-
2e740 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33  >jfd =  (sqlite3
2e750 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2e760 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2e770 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
2e780 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72  ename =    (char
2e790 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2e7a0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61  alFileSize);.  a
2e7b0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
2e7c0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67  E_ALIGNMENT(pPag
2e7d0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  er->jfd) );..  /
2e7e0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61  * Fill in the Pa
2e7f0 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e  ger.zFilename an
2e800 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
2e810 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71   buffers, if req
2e820 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
2e830 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
2e840 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61   assert( nPathna
2e850 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67  me>0 );.    pPag
2e860 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
2e870 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2e880 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2e890 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2e8a0 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
2e8b0 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
2e8c0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2e8d0 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63   if( nUri ) memc
2e8e0 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c  py(&pPager->zFil
2e8f0 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
2e900 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  1], zUri, nUri);
2e910 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2e920 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50  er->zJournal, zP
2e930 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2e940 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2e950 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2e960 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2e970 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b  journal\000", 8+
2e980 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  2);.    sqlite3F
2e990 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2e9a0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2e9b0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
2e9c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e9d0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61  OMIT_WAL.    pPa
2e9e0 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61  ger->zWal = &pPa
2e9f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2ea00 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20  athname+8+1];.  
2ea10 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2ea20 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  >zWal, zPathname
2ea30 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2ea40 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2ea50 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ->zWal[nPathname
2ea60 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34  ], "-wal\000", 4
2ea70 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
2ea80 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67  FileSuffix3(pPag
2ea90 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2eaa0 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65  Pager->zWal);.#e
2eab0 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
2eac0 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2ead0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
2eae0 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
2eaf0 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
2eb00 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
2eb10 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
2eb20 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
2eb30 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2eb40 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2eb50 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
2eb60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2eb70 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
2eb80 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2eb90 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
2eba0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2ebb0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2ebc0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2ebd0 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
2ebe0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73  , &fout);.    as
2ebf0 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a  sert( !memDb );.
2ec00 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2ec10 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2ec20 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
2ec30 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2ec40 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2ec50 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
2ec60 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
2ec70 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
2ec80 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2ec90 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
2eca0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
2ecb0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
2ecc0 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
2ecd0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
2ece0 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
2ecf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
2ed00 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ed10 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
2ed20 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
2ed30 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2ed40 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
2ed50 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
2ed60 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
2ed70 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
2ed80 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
2ed90 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
2eda0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2edb0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
2edc0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2edd0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2ede0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2edf0 0a 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64  .      if( !read
2ee00 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
2ee10 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2ee20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
2ee30 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
2ee40 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2ee50 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2ee60 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
2ee70 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67         if( szPag
2ee80 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65  eDflt<pPager->se
2ee90 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20  ctorSize ){.    
2eea0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2eeb0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
2eec0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2eed0 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
2eee0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2eef0 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
2ef00 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2ef10 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ZE;.          }e
2ef20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2ef30 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2ef40 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2ef50 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
2ef60 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66   }.        }.#if
2ef70 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2ef80 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2ef90 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2efa0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
2efb0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2efc0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
2efd0 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
2efe0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2eff0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2f000 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
2f010 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2f020 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2f030 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2f040 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2f050 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
2f060 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
2f070 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2f080 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
2f090 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  *2){.           
2f0a0 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
2f0b0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
2f0c0 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
2f0d0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2f0e0 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
2f0f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2f100 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
2f110 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
2f120 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b    pPager->noLock
2f130 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62   = sqlite3_uri_b
2f140 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65  oolean(zFilename
2f150 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a  , "nolock", 0);.
2f160 20 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26        if( (iDc &
2f170 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d   SQLITE_IOCAP_IM
2f180 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20  MUTABLE)!=0.    
2f190 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72     || sqlite3_ur
2f1a0 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e  i_boolean(zFilen
2f1b0 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22  ame, "immutable"
2f1c0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
2f1d0 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51    vfsFlags |= SQ
2f1e0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2f1f0 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  LY;.          go
2f200 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  to act_like_temp
2f210 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _file;.      }. 
2f220 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2f230 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2f240 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2f250 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2f260 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2f270 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2f280 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2f290 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2f2a0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2f2b0 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2f2c0 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2f2d0 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2f2e0 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2f2f0 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2f300 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2f310 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2f320 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2f330 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2f340 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2f350 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2f360 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2f370 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2f380 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2f390 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2f3a0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2f3b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2f3c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2f3d0 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20  his branch also 
2f3e0 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d  runs for files m
2f3f0 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62  arked as immutab
2f400 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f  le..    */ .act_
2f410 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a  like_temp_file:.
2f420 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
2f430 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
2f440 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
2f450 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74  DER;     /* Pret
2f460 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68  end we already h
2f470 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ave a lock */.  
2f480 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
2f490 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
2f4a0 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20  ;    /* Pretend 
2f4b0 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53  we are in EXCLUS
2f4c0 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  IVE mode */.    
2f4d0 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2f4e0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2f4f0 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b     /* Do no lock
2f500 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f  ing */.    readO
2f510 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
2f520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f530 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
2f540 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2f550 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
2f560 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
2f570 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
2f580 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
2f590 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
2f5a0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
2f5b0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
2f5c0 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
2f5d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f5e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2f5f0 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
2f600 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2f610 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
2f620 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
2f630 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
2f640 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
2f650 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
2f660 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2f670 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
2f680 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ct. */.  if( rc=
2f690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f6a0 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
2f6b0 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 61  8(nExtra);.    a
2f6c0 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 38  ssert( nExtra>=8
2f6d0 20 26 26 20 6e 45 78 74 72 61 3c 31 30 30 30 20   && nExtra<1000 
2f6e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2f6f0 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
2f700 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
2f710 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
2f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f730 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
2f740 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
2f750 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
2f760 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20  PCache);.  }..  
2f770 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2f780 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66  ccurred above, f
2f790 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20 73  ree the  Pager s
2f7a0 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
2f7b0 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
2f7c0 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
2f7d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2f7e0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2f7f0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
2f800 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
2f810 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
2f820 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2f830 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
2f840 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2f850 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
2f860 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
2f870 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
2f880 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
2f890 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
2f8a0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
2f8b0 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
2f8c0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2f8d0 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
2f8e0 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
2f8f0 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20  seJournal;.  /* 
2f900 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
2f910 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2f920 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
2f930 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2f940 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
2f950 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2f960 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
2f970 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2f980 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
2f990 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
2f9a0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
2f9b0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
2f9c0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
2f9d0 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
2f9e0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
2f9f0 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
2fa00 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
2fa10 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2fa20 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
2fa30 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
2fa40 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
2fa50 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2fa60 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
2fa70 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
2fa80 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2fa90 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2faa0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
2fab0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2fac0 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
2fad0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2fae0 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2faf0 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
2fb00 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
2fb10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2fb20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
2fb30 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
2fb40 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2fb50 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
2fb60 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
2fb70 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
2fb80 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
2fb90 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
2fba0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2fbb0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2fbc0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
2fbd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
2fbe0 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  llSync==0 );.   
2fbf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2fc00 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b  >extraSync==0 );
2fc10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2fc20 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
2fc30 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2fc40 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2fc50 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2fc60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fc70 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30  ckptSyncFlags==0
2fc80 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2fc90 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2fca0 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  c = 1;.    pPage
2fcb0 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30  r->extraSync = 0
2fcc0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  ;.    pPager->sy
2fcd0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2fce0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2fcf0 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
2fd00 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2fd10 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41  SYNC_NORMAL | WA
2fd20 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49  L_SYNC_TRANSACTI
2fd30 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ONS;.    pPager-
2fd40 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
2fd50 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2fd60 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  MAL;.  }.  /* pP
2fd70 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
2fd80 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2fd90 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
2fda0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2fdb0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
2fdc0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
2fdd0 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
2fde0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
2fdf0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
2fe00 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
2fe10 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
2fe20 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2fe30 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2fe40 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
2fe50 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2fe60 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
2fe70 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2fe80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2fe90 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2fea0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
2feb0 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
2fec0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2fed0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2fee0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2fef0 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
2ff00 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
2ff10 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
2ff20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
2ff30 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
2ff40 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
2ff50 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
2ff60 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
2ff70 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20  d(pPager);.  /* 
2ff80 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
2ff90 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
2ffa0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
2ffb0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2ffc0 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45  >szMmap = SQLITE
2ffd0 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49  _DEFAULT_MMAP_SI
2ffe0 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65  ZE // will be se
2fff0 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a  t by btree.c */.
30000 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
30010 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
30020 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
30030 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
30040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
30050 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65  as not be delete
30060 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74  d or renamed out
30070 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74   from.** under t
30080 68 65 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  he pager.  Retur
30090 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
300a0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73  he database is s
300b0 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67  till were it oug
300c0 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64  ht.** to be on d
300d0 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  isk.  Return non
300e0 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45  -zero (SQLITE_RE
300f0 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f  ADONLY_DBMOVED o
30100 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
30110 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20  or.** code from 
30120 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
30130 29 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  )) if the databa
30140 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73  se has gone miss
30150 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
30160 6e 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d  nt databaseIsUnm
30170 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  oved(Pager *pPag
30180 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d  er){.  int bHasM
30190 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  oved = 0;.  int 
301a0 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
301b0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65  r->tempFile ) re
301c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
301d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
301e0 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Size==0 ) return
301f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
30200 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46  sert( pPager->zF
30210 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65  ilename && pPage
30220 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  r->zFilename[0] 
30230 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
30240 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
30250 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
30260 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45  E_FCNTL_HAS_MOVE
30270 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a  D, &bHasMoved);.
30280 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30290 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20  _NOTFOUND ){.   
302a0 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d   /* If the HAS_M
302b0 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  OVED file-contro
302c0 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74  l is unimplement
302d0 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ed, assume that 
302e0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
302f0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76  has not been mov
30300 65 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65  ed.  That is the
30310 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61   historical beha
30320 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20  vior of SQLite: 
30330 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20  prior to.    ** 
30340 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69  version 3.8.3, i
30350 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20  t never checked 
30360 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
30370 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
30380 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30390 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b   && bHasMoved ){
303a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
303b0 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
303c0 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
303d0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
303e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
303f0 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
30400 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
30410 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
30420 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
30430 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
30440 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
30450 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
30460 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
30470 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
30480 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
30490 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
304a0 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
304b0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
304c0 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
304d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
304e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
304f0 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
30500 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
30510 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
30520 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
30530 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
30540 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
30550 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
30560 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
30570 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
30580 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
30590 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
305a0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
305b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
305c0 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
305d0 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
305e0 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
305f0 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
30600 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
30610 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
30620 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
30630 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
30640 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
30650 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
30660 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
30670 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
30680 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
30690 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
306a0 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
306b0 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
306c0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
306d0 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
306e0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
306f0 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
30700 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
30710 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
30720 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
30730 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
30740 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
30750 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
30760 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
30770 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
30780 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
30790 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
307a0 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
307b0 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
307c0 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
307d0 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
307e0 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
307f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30800 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
30810 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
30820 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
30830 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
30840 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
30850 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
30860 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
30870 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
30880 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30890 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
308a0 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
308b0 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
308c0 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
308d0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
308e0 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
308f0 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
30900 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
30910 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
30920 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
30930 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
30940 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
30950 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
30960 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
30970 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
30980 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
30990 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
309a0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
309b0 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
309c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
309d0 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
309e0 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
309f0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
30a00 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
30a10 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
30a20 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
30a30 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
30a40 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
30a50 69 73 74 73 2c 20 69 6e 74 20 2a 70 65 53 65 72  ists, int *peSer
30a60 76 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ver){.  sqlite3_
30a70 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
30a80 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
30a90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30aa0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
30ab0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
30ac0 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
30ad0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
30ae0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
30af0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30b00 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
30b10 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
30b20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
30b30 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
30b40 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
30b50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
30b60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
30b70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
30b80 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
30b90 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61  GER_OPEN );..  a
30ba0 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d  ssert( jrnlOpen=
30bb0 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f  =0 || ( sqlite3O
30bc0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
30bd0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a  istics(pPager->j
30be0 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45  fd) &.    SQLITE
30bf0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
30c00 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29  LE_WHEN_OPEN.  )
30c10 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
30c20 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f   0;.  if( !jrnlO
30c30 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
30c40 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
30c50 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
30c60 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
30c70 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
30c80 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66  xists);.  }.  if
30c90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30ca0 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
30cb0 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b   int locked = 0;
30cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30cd0 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
30ce0 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
30cf0 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 23  ERVED lock */..#
30d00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52  ifdef SQLITE_SER
30d10 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 20 20  VER_EDITION.    
30d20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
30d30 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
30d40 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
30d50 54 4c 5f 53 45 52 56 45 52 5f 4d 4f 44 45 2c 20  TL_SERVER_MODE, 
30d60 70 65 53 65 72 76 65 72 29 3b 0a 20 20 20 20 69  peServer);.    i
30d70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc!=SQLITE_NO
30d80 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  TFOUND ){.      
30d90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30da0 4b 20 7c 7c 20 2a 70 65 53 65 72 76 65 72 20 29  K || *peServer )
30db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30dc0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
30dd0 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   Race condition 
30de0 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70  here:  Another p
30df0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76  rocess might hav
30e00 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74  e been holding t
30e10 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45  he.    ** the RE
30e20 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SERVED lock and 
30e30 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  have a journal o
30e40 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74  pen at the sqlit
30e50 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20  e3OsAccess() .  
30e60 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c    ** call above,
30e70 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65   but then delete
30e80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
30e90 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62   drop the lock b
30ea0 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20  efore.    ** we 
30eb0 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  get to the follo
30ec0 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68  wing sqlite3OsCh
30ed0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
30ee0 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74  ) call.  If that
30ef0 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63  .    ** is the c
30f00 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
30f10 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68  e might think th
30f20 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
30f30 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  rnal when.    **
30f40 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69   in fact there i
30f50 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65  s none.  This re
30f60 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65  sults in a false
30f70 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20  -positive which 
30f80 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64  will.    ** be d
30f90 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65  ealt with by the
30fa0 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e   playback routin
30fb0 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33  e.  Ticket #3883
30fc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
30fd0 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  = sqlite3OsCheck
30fe0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
30ff0 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64  ger->fd, &locked
31000 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
31010 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63  QLITE_OK && !loc
31020 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ked ){.      Pgn
31030 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
31040 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
31050 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
31060 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
31070 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31080 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
31090 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
310a0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
310b0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
310c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
310d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
310e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
310f0 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20 70  tabase is zero p
31100 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ages in size, th
31110 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69  at means that ei
31120 74 68 65 72 20 28 31 29 20 74 68 65 0a 20 20 20  ther (1) the.   
31130 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
31140 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f  is a remnant fro
31150 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61 62 61  m a prior databa
31160 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
31170 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20 20   name where.    
31180 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
31190 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f 74  ase file but not
311a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
311b0 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32 29   deleted, or (2)
311c0 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20 20   the initial.   
311d0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
311e0 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61 74  ion that populat
311f0 65 73 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  es a new databas
31200 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
31210 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  d back..        
31220 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
31230 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
31240 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65 74  ile can be delet
31250 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 61  ed.  However, ta
31260 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20 20 20  ke care.        
31270 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65  ** not to delete
31280 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31290 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
312a0 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20  dy open due to. 
312b0 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
312c0 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a  l_mode=PERSIST..
312d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
312e0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
312f0 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  && !jrnlOpen ){.
31300 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31310 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
31320 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oc();.          
31330 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  if( pagerLockDb(
31340 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
31350 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f  _LOCK)==SQLITE_O
31360 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
31370 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
31380 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
31390 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
313a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
313b0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
313c0 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63  ode ) pagerUnloc
313d0 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
313e0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
313f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31400 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
31410 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
31420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31430 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
31440 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
31450 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
31460 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
31470 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
31480 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
31490 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
314a0 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
314b0 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
314c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
314d0 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
314e0 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
314f0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
31500 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
31510 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
31520 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
31530 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
31540 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
31550 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
31560 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
31570 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
31580 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
31590 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
315a0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
315b0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
315c0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
315d0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
315e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
315f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
31600 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
31610 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
31620 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
31630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31640 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31660 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
31670 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
31680 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
31690 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
316a0 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
316b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
316c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
316d0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
316e0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
316f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
31700 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
31710 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31720 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
31730 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31740 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
31750 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
31760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31770 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
31780 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
31790 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
317a0 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
317b0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
317c0 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
317d0 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
317e0 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
317f0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
31800 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
31810 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f 20  * it has a zero 
31820 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
31830 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
31840 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
31850 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
31860 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
31870 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
31880 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
31890 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
318a0 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
318b0 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
318c0 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
318d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
318e0 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
318f0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
31900 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
31910 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
31920 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
31930 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
31940 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
31950 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
31960 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
31970 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
31980 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
31990 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
319a0 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
319b0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
319c0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
319d0 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
319e0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
319f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
31a00 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
31a10 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
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 7d  _OK;.          }
31a40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31a50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
31a60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
31a70 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56  fdef SQLITE_SERV
31a80 45 52 5f 45 44 49 54 49 4f 4e 0a 73 74 61 74 69  ER_EDITION.stati
31a90 63 20 69 6e 74 20 70 61 67 65 72 53 65 72 76 65  c int pagerServe
31aa0 72 43 6f 6e 6e 65 63 74 28 50 61 67 65 72 20 2a  rConnect(Pager *
31ab0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
31ac0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31ad0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
31ae0 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
31af0 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
31b00 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
31b10 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
31b20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31b30 50 45 52 53 49 53 54 3b 0a 20 20 20 20 72 63 20  PERSIST;.    rc 
31b40 3d 20 73 71 6c 69 74 65 33 53 65 72 76 65 72 43  = sqlite3ServerC
31b50 6f 6e 6e 65 63 74 28 70 50 61 67 65 72 2c 20 26  onnect(pPager, &
31b60 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 29  pPager->pServer)
31b70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
31b80 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  c;.}..int sqlite
31b90 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 4a 6f  3PagerRollbackJo
31ba0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
31bb0 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c  ger, sqlite3_fil
31bc0 65 20 2a 70 4a 66 64 29 7b 0a 20 20 69 6e 74 20  e *pJfd){.  int 
31bd0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
31be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
31bf0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
31c00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 61  sqlite3_file *sa
31c10 76 65 64 5f 6a 66 64 20 3d 20 70 50 61 67 65 72  ved_jfd = pPager
31c20 2d 3e 6a 66 64 3b 0a 20 20 75 38 20 73 61 76 65  ->jfd;.  u8 save
31c30 64 5f 65 53 74 61 74 65 20 3d 20 70 50 61 67 65  d_eState = pPage
31c40 72 2d 3e 65 53 74 61 74 65 3b 0a 20 20 75 38 20  r->eState;.  u8 
31c50 73 61 76 65 64 5f 65 4c 6f 63 6b 20 3d 20 70 50  saved_eLock = pP
31c60 61 67 65 72 2d 3e 65 4c 6f 63 6b 3b 0a 20 20 69  ager->eLock;.  i
31c70 36 34 20 73 61 76 65 64 5f 6a 6f 75 72 6e 61 6c  64 saved_journal
31c80 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
31c90 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 36 34 20  urnalOff;.  i64 
31ca0 73 61 76 65 64 5f 6a 6f 75 72 6e 61 6c 48 64 72  saved_journalHdr
31cb0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
31cc0 61 6c 48 64 72 3b 0a 0a 20 20 61 73 73 65 72 74  alHdr;..  assert
31cd0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
31ce0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
31cf0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
31d00 20 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 65   );..  pPager->e
31d10 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45  Lock = EXCLUSIVE
31d20 5f 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d  _LOCK;.  pPager-
31d30 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
31d40 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20  WRITER_DBMOD;.  
31d50 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 70 4a  pPager->jfd = pJ
31d60 66 64 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  fd;.  rc = pager
31d70 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
31d80 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
31d90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
31da0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
31db0 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 0a 20  k(pPager, 1);.. 
31dc0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
31dd0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
31de0 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
31df0 73 61 76 65 64 5f 6a 66 64 3b 0a 20 20 70 50 61  saved_jfd;.  pPa
31e00 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 73 61  ger->eState = sa
31e10 76 65 64 5f 65 53 74 61 74 65 3b 0a 20 20 70 50  ved_eState;.  pP
31e20 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 73 61  ager->eLock = sa
31e30 76 65 64 5f 65 4c 6f 63 6b 3b 0a 20 20 70 50 61  ved_eLock;.  pPa
31e40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
31e50 3d 20 73 61 76 65 64 5f 6a 6f 75 72 6e 61 6c 4f  = saved_journalO
31e60 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ff;.  pPager->jo
31e70 75 72 6e 61 6c 48 64 72 20 3d 20 73 61 76 65 64  urnalHdr = saved
31e80 5f 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 72  _journalHdr;.  r
31e90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 76 6f 69  eturn rc;.}..voi
31ea0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
31eb0 72 76 65 72 4a 6f 75 72 6e 61 6c 28 0a 20 20 50  rverJournal(.  P
31ec0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
31ed0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
31ee0 66 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  fd,.  const char
31ef0 20 2a 7a 4a 6f 75 72 6e 61 6c 0a 29 7b 0a 20 20   *zJournal.){.  
31f00 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
31f10 20 3d 20 28 63 68 61 72 2a 29 7a 4a 6f 75 72 6e   = (char*)zJourn
31f20 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  al;.  pPager->jf
31f30 64 20 3d 20 6a 66 64 3b 0a 7d 0a 23 65 6e 64 69  d = jfd;.}.#endi
31f40 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f.../*.** This f
31f50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
31f60 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  d to obtain a sh
31f70 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
31f80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
31f90 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
31fa0 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
31fb0 50 61 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c  PagerGet() until
31fc0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
31fd0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
31fe0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61   successfully ca
31ff0 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65  lled. If a share
32000 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  d-lock is alread
32010 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74  y held when.** t
32020 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32030 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
32040 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
32050 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61   following opera
32060 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70  tions are also p
32070 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73  erformed by this
32080 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
32090 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67     1) If the pag
320a0 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
320b0 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  in PAGER_OPEN st
320c0 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c  ate (no lock hel
320d0 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  d.**      on the
320e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
320f0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
32100 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
32110 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41  in a.**      SHA
32120 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
32130 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
32140 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
32150 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20   obtaining.**   
32160 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f     the SHARED lo
32170 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ck, the file-sys
32180 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66  tem is checked f
32190 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
321a0 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20  ,.**      which 
321b0 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  is played back i
321c0 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f  f present. Follo
321d0 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75  wing any hot-jou
321e0 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f  rnal .**      ro
321f0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74  llback, the cont
32200 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68  ents of the cach
32210 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20  e are validated 
32220 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20  by checking.**  
32230 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d      the 'change-
32240 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f  counter' field o
32250 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
32260 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a  ile header and.*
32270 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64  *      discarded
32280 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75   if they are fou
32290 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  nd to be invalid
322a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20  ..**.**   2) If 
322b0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
322c0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
322d0 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72  e-mode, and ther
322e0 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
322f0 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74  **      no outst
32300 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
32310 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20  s to any pages, 
32320 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72  and is in the er
32330 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20  ror state,.**   
32340 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d     then an attem
32350 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
32360 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
32370 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e  ate by discardin
32380 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f  g.**      the co
32390 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
323a0 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  ge cache and rol
323b0 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70  ling back any op
323c0 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  en journal.**   
323d0 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49     file..**.** I
323e0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
323f0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
32400 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
32410 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
32420 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69  r .** occurs whi
32430 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
32440 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
32450 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
32460 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20  nal file or .** 
32470 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
32480 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
32490 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
324a0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
324b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
324c0 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
324d0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 62 52 65  *pPager, int bRe
324e0 61 64 6f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  adonly){.  int r
324f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
32500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32510 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
32520 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
32530 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 69  RVER_EDITION.  i
32540 6e 74 20 65 53 65 72 76 65 72 20 3d 20 30 3b 0a  nt eServer = 0;.
32550 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 68 69  #endif..  /* Thi
32560 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
32570 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d  y called from b-
32580 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68  tree and only wh
32590 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  en there are no.
325a0 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67    ** outstanding
325b0 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70   pages. This imp
325c0 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61  lies that the pa
325d0 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64  ger state should
325e0 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20   either.  ** be 
325f0 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20  OPEN or READER. 
32600 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70  READER is only p
32610 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70  ossible if the p
32620 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69  ager is or was i
32630 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76  n .  ** exclusiv
32640 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 20 20  e access mode.  
32650 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
32660 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
32670 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
32680 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  he)==0 );.  asse
32690 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
326a0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
326b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
326c0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
326d0 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
326e0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
326f0 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
32700 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
32710 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
32720 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  ;..  if( !pagerU
32730 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20  seWal(pPager) . 
32740 20 20 26 26 20 21 70 61 67 65 72 49 73 53 65 72    && !pagerIsSer
32750 76 65 72 28 70 50 61 67 65 72 29 20 0a 20 20 20  ver(pPager) .   
32760 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
32770 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e==PAGER_OPEN ){
32780 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75  .    int bHotJou
32790 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20  rnal = 1;       
327a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
327b0 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74  ere exists a hot
327c0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f   journal-file */
327d0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ..    assert( !M
327e0 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
327f0 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
32800 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  File==0 || pPage
32810 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
32820 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20  IVE_LOCK );..   
32830 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
32840 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
32850 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
32860 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
32880 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
32890 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock==NO_LOCK || 
328a0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55  pPager->eLock==U
328b0 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
328c0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
328d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
328e0 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
328f0 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
32900 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
32910 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
32920 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
32930 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
32940 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
32950 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
32960 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
32970 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
32980 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
32990 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
329a0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
329b0 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e  ager, &bHotJourn
329c0 61 6c 2c 20 26 65 53 65 72 76 65 72 29 3b 0a 20  al, &eServer);. 
329d0 20 20 20 20 20 61 73 73 65 72 74 28 20 62 48 6f       assert( bHo
329e0 74 4a 6f 75 72 6e 61 6c 3d 3d 30 20 7c 7c 20 65  tJournal==0 || e
329f0 53 65 72 76 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Server==0 );.   
32a00 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
32a10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32a20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
32a30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f     }.    if( bHo
32a40 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
32a50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
32a60 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
32a70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
32a80 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b  ADONLY_ROLLBACK;
32a90 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
32aa0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
32ab0 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
32ac0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
32ad0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32ae0 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
32af0 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
32b00 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
32b10 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
32b20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
32b30 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
32b40 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
32b50 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
32b60 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
32b70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
32b80 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
32b90 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
32ba0 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
32bb0 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
32bc0 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
32bd0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
32be0 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
32bf0 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
32c00 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
32c10 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
32c20 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
32c30 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
32c40 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
32c50 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
32c60 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
32c70 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
32c80 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
32c90 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
32ca0 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
32cb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32cc0 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
32cd0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
32ce0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
32cf0 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
32d00 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
32d10 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
32d20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
32d30 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
32d40 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
32d50 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
32d60 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  n locking_mode=e
32d70 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
32d80 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20  he lock is.     
32d90 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74   ** downgraded t
32da0 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65  o SHARED_LOCK be
32db0 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
32dc0 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20  on returns..    
32dd0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
32de0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
32df0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
32e00 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
32e10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32e20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
32e30 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20  led;.      }. . 
32e40 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73       /* If it is
32e50 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
32e60 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65  n and the file e
32e70 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f  xists on disk, o
32e80 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  pen the .      *
32e90 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  * journal for re
32ea0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
32eb0 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73   Write access is
32ec0 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73   required becaus
32ed0 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65  e .      ** in e
32ee0 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
32ef0 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65  mode the file de
32f00 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
32f10 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20   kept open .    
32f20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c    ** and possibl
32f30 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
32f40 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
32f50 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61  n. Also, write-a
32f60 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20  ccess .      ** 
32f70 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69  is usually requi
32f80 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  red to finalize 
32f90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a  the journal in j
32fa0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73  ournal_mode=pers
32fb0 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  ist .      ** mo
32fc0 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72  de (and also for
32fd0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72   journal_mode=tr
32fe0 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73  uncate on some s
32ff0 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a  ystems)..      *
33000 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
33010 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  e journal does n
33020 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75  ot exist, it usu
33030 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  ally means that 
33040 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f  some .      ** o
33050 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
33060 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69  managed to get i
33070 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61  n and roll it ba
33080 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20  ck before .     
33090 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   ** this connect
330a0 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65  ion obtained the
330b0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
330c0 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20  above. Or, it . 
330d0 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e       ** may mean
330e0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
330f0 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72  was in the error
33100 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
33110 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
33120 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e  on was called an
33130 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
33140 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
33150 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
33160 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
33170 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
33180 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
33190 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
331a0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
331b0 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73         int bExis
331c0 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ts;             
331d0 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
331e0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
331f0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
33200 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
33210 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66  .            pVf
33220 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
33230 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
33240 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69  SS_EXISTS, &bExi
33250 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sts);.        if
33260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33270 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20  && bExists ){.  
33280 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
33290 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
332a0 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
332b0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
332c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
332d0 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
332e0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
332f0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
33300 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
33310 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
33320 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
33330 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
33340 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20   f, &fout);.    
33350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
33360 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
33370 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
33380 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
33390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
333a0 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
333b0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
333c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
333d0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
333e0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EN_BKPT;.       
333f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
33400 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
33410 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
33420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33430 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
33440 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
33450 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
33460 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
33470 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
33480 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
33490 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
334a0 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
334b0 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
334c0 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
334d0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
334e0 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
334f0 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
33500 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
33510 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20  nt cache.  Sync 
33520 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  the hot journal 
33530 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20  before playing. 
33540 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20       ** it back 
33550 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73  since the proces
33560 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61  s that crashed a
33570 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20  nd left the hot 
33580 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
33590 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f   probably did no
335a0 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65  t sync it and we
335b0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
335c0 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20   always sync.   
335d0 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
335e0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
335f0 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   it back..      
33600 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  */.      if( isO
33610 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
33620 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
33630 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
33640 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  K );.        rc 
33650 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  = pagerSyncHotJo
33660 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
33670 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
33680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33690 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
336a0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
336b0 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  , !pPager->tempF
336c0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
336d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
336e0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
336f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
33700 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
33710 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
33720 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e  .        pagerUn
33730 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
33740 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
33750 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
33760 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33770 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
33780 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
33790 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
337a0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
337b0 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   to open.       
337c0 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b   ** or roll back
337d0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
337e0 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  hile holding an 
337f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
33800 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
33810 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f  ager_unlock() ro
33820 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
33830 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  lled before retu
33840 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a  rning to unlock.
33850 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
33860 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f  ile. If the unlo
33870 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73  ck attempt fails
33880 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f  , then Pager.eLo
33890 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20  ck must be.     
338a0 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b     ** set to UNK
338b0 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74  NOWN_LOCK (see t
338c0 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
338d0 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
338e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b   .        ** UNK
338f0 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20  NOWN_LOCK above 
33900 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
33910 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  on). .        **
33920 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f  .        ** In o
33930 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65  rder to get page
33940 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f  r_unlock() to do
33950 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72   this, set Pager
33960 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20  .eState to.     
33970 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f     ** PAGER_ERRO
33980 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e  R now. This is n
33990 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e  ot actually coun
339a0 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74  ted as a transit
339b0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
339c0 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e  o ERROR state in
339d0 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72   the state diagr
339e0 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  am at the top of
339f0 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20   this file,.    
33a00 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
33a10 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61  know that the sa
33a20 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  me call to pager
33a30 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76  _unlock() will v
33a40 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ery.        ** s
33a50 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f  hortly transitio
33a60 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
33a70 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73  ct to the OPEN s
33a80 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20  tate. Calling.  
33a90 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f        ** assert_
33aa0 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f  pager_state() wo
33ab0 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73  uld fail now, as
33ac0 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62   it should not b
33ad0 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  e possible.     
33ae0 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45     ** to be in E
33af0 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
33b00 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f  there are zero o
33b10 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
33b20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65  .        ** refe
33b30 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20  rences..        
33b40 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  */.        pager
33b50 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
33b60 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  c);.        goto
33b70 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
33b80 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
33b90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33ba0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
33bb0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
33bc0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52  ger->eLock==SHAR
33bd0 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
33be0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
33bf0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
33c00 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53   pPager->eLock>S
33c10 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
33c20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
33c30 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
33c40 70 46 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d  pFile && pPager-
33c50 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
33c60 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ck ){.      /* T
33c70 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
33c80 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
33c90 75 69 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b  uired then check
33ca0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
33cb0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
33cc0 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
33cd0 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
33ce0 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64  base has changed
33cf0 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68  ,.      ** flush
33d00 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
33d10 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
33d20 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73  ck flag prevents
33d30 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20   this from.     
33d40 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e   ** occurring on
33d50 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
33d60 61 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65  access to a file
33d70 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61  , in order to sa
33d80 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  ve a.      ** si
33d90 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79  ngle unnecessary
33da0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29   sqlite3OsRead()
33db0 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61   call at the sta
33dc0 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a  rt-up..      **.
33dd0 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
33de0 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 64 65  e changes are de
33df0 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
33e00 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
33e10 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
33e20 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
33e30 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
33e40 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
33e50 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
33e60 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
33e70 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
33e80 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
33e90 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
33ea0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
33eb0 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
33ec0 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
33ed0 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
33ee0 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
33ef0 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
33f00 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
33f10 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
33f20 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
33f30 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
33f40 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
33f50 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
33f60 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
33f70 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
33f80 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
33f90 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
33fa0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
33fb0 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
33fc0 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  /.      char dbF
33fd0 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
33fe0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
33ff0 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f 54 52  s)];..      IOTR
34000 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
34010 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
34020 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
34030 29 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  )));.      rc = 
34040 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
34050 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
34060 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
34070 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
34080 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
340a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
340b0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
340c0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
340d0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
340e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
340f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
34100 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
34110 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
34120 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
34130 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
34140 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67   if( memcmp(pPag
34150 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
34160 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
34170 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21  of(dbFileVers))!
34180 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  =0 ){.        pa
34190 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
341a0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  );..        /* U
341b0 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62 61 73  nmap the databas
341c0 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f  e file. It is po
341d0 73 73 69 62 6c 65 20 74 68 61 74 20 65 78 74 65  ssible that exte
341e0 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20  rnal processes. 
341f0 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61         ** may ha
34200 76 65 20 74 72 75 6e 63 61 74 65 64 20 74 68 65  ve truncated the
34210 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
34220 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64  nd then extended
34230 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20   it back.       
34240 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69   ** to its origi
34250 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74  nal size while t
34260 68 69 73 20 70 72 6f 63 65 73 73 20 77 61 73 20  his process was 
34270 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  not holding a lo
34280 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ck..        ** I
34290 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
342a0 65 20 6d 61 79 20 65 78 69 73 74 20 61 20 50 61  e may exist a Pa
342b0 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67  ger.pMap mapping
342c0 20 74 68 61 74 20 61 70 70 65 61 72 73 0a 20 20   that appears.  
342d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74        ** to be t
342e0 68 65 20 72 69 67 68 74 20 73 69 7a 65 20 62 75  he right size bu
342f0 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  t is not actuall
34300 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74  y valid. Avoid t
34310 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
34320 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e  ossibility by un
34330 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62 20 68  mapping the db h
34340 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ere. */.        
34350 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
34360 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
34370 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
34380 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
34390 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
343a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
343b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52  ifdef SQLITE_SER
343c0 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 20 20  VER_EDITION.    
343d0 69 66 28 20 65 53 65 72 76 65 72 20 29 7b 0a 20  if( eServer ){. 
343e0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
343f0 65 72 76 65 72 43 6f 6e 6e 65 63 74 28 70 50 61  erverConnect(pPa
34400 67 65 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ger);.    }.#end
34410 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
34420 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
34430 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
34440 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
34450 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
34460 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
34470 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
34480 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
34490 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
344a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
344b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
344c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
344d0 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
344e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
344f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34500 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
34510 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
34520 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
34530 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
34540 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
34550 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e  E_SERVER_EDITION
34560 0a 20 20 69 66 28 20 70 61 67 65 72 49 73 53 65  .  if( pagerIsSe
34570 72 76 65 72 28 70 50 61 67 65 72 29 20 29 7b 0a  rver(pPager) ){.
34580 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
34590 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
345a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
345b0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
345c0 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ager)==0 );.    
345d0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
345e0 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
345f0 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
34600 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  t(pPager);.    r
34610 63 20 3d 20 73 71 6c 69 74 65 33 53 65 72 76 65  c = sqlite3Serve
34620 72 42 65 67 69 6e 28 70 50 61 67 65 72 2d 3e 70  rBegin(pPager->p
34630 53 65 72 76 65 72 2c 20 62 52 65 61 64 6f 6e 6c  Server, bReadonl
34640 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  y);.    if( rc==
34650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34660 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
34670 65 72 76 65 72 4c 6f 63 6b 28 70 50 61 67 65 72  erverLock(pPager
34680 2d 3e 70 53 65 72 76 65 72 2c 20 31 2c 20 30 2c  ->pServer, 1, 0,
34690 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23   0);.    }.  }.#
346a0 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 3d 3d  endif.  if( rc==
346b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 61 67  SQLITE_OK && pag
346c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
346d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
346e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
346f0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
34700 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
34710 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
34720 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
34730 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70  tempFile==0 && p
34740 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
34750 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d  AGER_OPEN && rc=
34760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34770 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
34780 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70  count(pPager, &p
34790 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
347a0 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
347b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
347c0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
347d0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
347e0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
347f0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
34800 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
34810 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
34820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
34830 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
34840 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
34850 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
34860 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  aredLock = 1;.  
34870 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
34880 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
34890 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
348a0 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
348b0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
348c0 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
348d0 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
348e0 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
348f0 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
34900 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
34910 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
34920 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
34930 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
34940 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
34950 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
34960 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
34970 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
34980 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
34990 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
349a0 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
349b0 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
349c0 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
349d0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
349e0 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d  ager->nMmapOut==
349f0 30 20 26 26 20 28 73 71 6c 69 74 65 33 50 63 61  0 && (sqlite3Pca
34a00 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
34a10 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29  er->pPCache)==0)
34a20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
34a30 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
34a40 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
34a50 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 67 65  *.** The page ge
34a60 74 74 65 72 20 6d 65 74 68 6f 64 73 20 65 61 63  tter methods eac
34a70 68 20 74 72 79 20 74 6f 20 61 63 71 75 69 72 65  h try to acquire
34a80 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
34a90 61 0a 2a 2a 20 70 61 67 65 20 77 69 74 68 20 70  a.** page with p
34aa0 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e  age number pgno.
34ab0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
34ac0 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
34ad0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
34ae0 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
34af0 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
34b00 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
34b10 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
34b20 54 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  There are differ
34b30 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
34b40 6f 6e 73 20 6f 66 20 74 68 65 20 67 65 74 74 65  ons of the gette
34b50 72 20 6d 65 74 68 6f 64 20 64 65 70 65 6e 64 69  r method dependi
34b60 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72  ng.** on the cur
34b70 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
34b80 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  e pager..**.**  
34b90 20 20 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c     getPageNormal
34ba0 28 29 20 20 20 20 20 20 20 20 20 2d 2d 20 20 54  ()         --  T
34bb0 68 65 20 6e 6f 72 6d 61 6c 20 67 65 74 74 65 72  he normal getter
34bc0 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 45  .**     getPageE
34bd0 72 72 6f 72 28 29 20 20 20 20 20 20 20 20 20 20  rror()          
34be0 2d 2d 20 20 55 73 65 64 20 69 66 20 74 68 65 20  --  Used if the 
34bf0 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65  pager is in an e
34c00 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20  rror state.**   
34c10 20 20 67 65 74 50 61 67 65 4d 6d 61 70 28 29 20    getPageMmap() 
34c20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 20 55 73            --  Us
34c30 65 64 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 70  ed if memory-map
34c40 70 65 64 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c  ped I/O is enabl
34c50 65 64 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  ed.**.** If the 
34c60 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
34c70 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
34c80 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
34c90 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
34ca0 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
34cb0 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
34cc0 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
34cd0 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
34ce0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
34cf0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
34d00 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
34d10 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
34d20 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
34d30 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
34d40 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
34d50 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
34d60 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
34d70 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
34d80 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
34d90 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
34da0 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
34db0 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
34dc0 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
34dd0 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
34de0 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
34df0 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
34e00 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
34e10 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
34e20 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
34e30 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
34e40 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
34e50 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
34e60 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
34e70 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
34e80 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
34e90 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
34ea0 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
34eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
34ec0 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
34ed0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
34ee0 64 20 70 61 67 65 20 6f 72 20 69 66 20 0a 2a 2a  d page or if .**
34ef0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
34f00 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 74 68  eter contains th
34f10 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  e PAGER_GET_NOCO
34f20 4e 54 45 4e 54 20 62 69 74 20 61 6e 64 20 74 68  NTENT bit and th
34f30 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
34f40 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
34f50 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ady stored in th
34f60 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f  e cache, then no
34f70 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b   .** actual disk
34f80 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e   read occurs. In
34f90 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d   this case the m
34fa0 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
34fb0 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69  he .** page is i
34fc0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
34fd0 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20  l zeros. .**.** 
34fe0 49 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  If PAGER_GET_NOC
34ff0 4f 4e 54 45 4e 54 20 69 73 20 74 72 75 65 2c 20  ONTENT is true, 
35000 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
35010 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
35020 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
35030 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ts of the page. 
35040 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
35050 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  wo scenarios:.**
35060 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65  .**   a) When re
35070 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73  ading a free-lis
35080 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d  t leaf page from
35090 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61   the database, a
350a0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68  nd.**.**   b) Wh
350b0 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69  en a savepoint i
350c0 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
350d0 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20  ack and we need 
350e0 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20  to load.**      
350f0 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20  a new page into 
35100 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20  the cache to be 
35110 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
35120 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20  data read.**    
35130 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70    from the savep
35140 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  oint journal..**
35150 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54  .** If PAGER_GET
35160 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72  _NOCONTENT is tr
35170 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
35180 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65  a returned is ze
35190 72 6f 65 64 20 69 6e 73 74 65 61 64 0a 2a 2a 20  roed instead.** 
351a0 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20 66 72  of being read fr
351b0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
351c0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
351d0 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f  he bits correspo
351e0 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f  nding.** to pgno
351f0 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
35200 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20  rnal (bitvec of 
35210 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72  pages already wr
35220 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
35230 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
35240 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
35250 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
35260 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79  t bitvecs of any
35270 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69   open.** savepoi
35280 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  nts are set. Thi
35290 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70  s means if the p
352a0 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  age is made writ
352b0 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70  able at any.** p
352c0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
352d0 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  re, using a call
352e0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
352f0 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e  Write(), its con
35300 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  tents.** will no
35310 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  t be journaled. 
35320 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a  This saves IO..*
35330 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
35340 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
35350 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
35360 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
35370 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
35380 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
35390 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
353a0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
353b0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
353c0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
353d0 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
353e0 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
353f0 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
35400 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
35410 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
35420 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
35430 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
35440 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
35450 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
35460 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
35470 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
35480 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
35490 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
354a0 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
354b0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
354c0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
354d0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
354e0 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
354f0 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
35500 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
35510 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
35520 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
35530 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
35540 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
35550 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
35560 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
35570 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
35580 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  files..*/.static
35590 20 69 6e 74 20 67 65 74 50 61 67 65 4e 6f 72 6d   int getPageNorm
355a0 61 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  al(.  Pager *pPa
355b0 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
355c0 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
355d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
355e0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
355f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
35600 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
35610 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
35620 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
35630 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
35640 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
35650 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
35660 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
35670 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
35680 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
35690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
356a0 64 72 20 2a 70 50 67 3b 0a 20 20 75 38 20 6e 6f  dr *pPg;.  u8 no
356b0 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20  Content;        
356c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
356d0 75 65 20 69 66 20 50 41 47 45 52 5f 47 45 54 5f  ue if PAGER_GET_
356e0 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 73 65 74  NOCONTENT is set
356f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 70 63   */.  sqlite3_pc
35700 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65  ache_page *pBase
35710 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
35720 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
35730 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
35740 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35750 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
35760 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
35770 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
35780 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
35790 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68  ssert( pPager->h
357a0 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
357b0 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  ==1 );..  if( pg
357c0 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  no==0 ) return S
357d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
357e0 50 54 3b 0a 20 20 70 42 61 73 65 20 3d 20 73 71  PT;.  pBase = sq
357f0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
35800 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
35810 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 69 66  , pgno, 3);.  if
35820 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20  ( pBase==0 ){.  
35830 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 72    pPg = 0;.    r
35840 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
35850 65 46 65 74 63 68 53 74 72 65 73 73 28 70 50 61  eFetchStress(pPa
35860 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
35870 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20  no, &pBase);.   
35880 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35890 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
358a0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
358b0 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b   if( pBase==0 ){
358c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
358d0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
358e0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
358f0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
35900 20 7d 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 2a   }.  }.  pPg = *
35910 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  ppPage = sqlite3
35920 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73  PcacheFetchFinis
35930 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
35940 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b  e, pgno, pBase);
35950 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 3d 3d  .  assert( pPg==
35960 28 2a 70 70 50 61 67 65 29 20 29 3b 0a 20 20 61  (*ppPage) );.  a
35970 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
35980 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
35990 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
359a0 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e  =pPager || pPg->
359b0 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20  pPager==0 );..  
359c0 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61  noContent = (fla
359d0 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 4e  gs & PAGER_GET_N
359e0 4f 43 4f 4e 54 45 4e 54 29 21 3d 30 3b 0a 20 20  OCONTENT)!=0;.  
359f0 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72 20  if( pPg->pPager 
35a00 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  && !noContent ){
35a10 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
35a20 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20  case the pcache 
35a30 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
35a40 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   an initialized 
35a50 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74  copy of.    ** t
35a60 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20  he page. Return 
35a70 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20  without further 
35a80 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ado.  */.    ass
35a90 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52  ert( pgno<=PAGER
35aa0 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e  _MAX_PGNO && pgn
35ab0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
35ac0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
35ad0 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
35ae0 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b  GER_STAT_HIT]++;
35af0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
35b00 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b  TE_OK;..  }else{
35b10 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
35b20 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
35b30 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
35b40 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
35b50 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
35b60 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 42 75 74  initialized. But
35b70 20 66 69 72 73 74 20 73 6f 6d 65 20 65 72 72 6f   first some erro
35b80 72 20 63 68 65 63 6b 73 3a 0a 20 20 20 20 2a 2a  r checks:.    **
35b90 0a 20 20 20 20 2a 2a 20 28 31 29 20 54 68 65 20  .    ** (1) The 
35ba0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
35bb0 62 65 72 20 69 73 20 32 5e 33 31 0a 20 20 20 20  ber is 2^31.    
35bc0 2a 2a 20 28 32 29 20 4e 65 76 65 72 20 74 72 79  ** (2) Never try
35bd0 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 6c 6f   to fetch the lo
35be0 63 6b 69 6e 67 20 70 61 67 65 0a 20 20 20 20 2a  cking page.    *
35bf0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50  /.    if( pgno>P
35c00 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
35c10 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
35c20 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
35c30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35c40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
35c50 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
35c60 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
35c70 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50    }..    pPg->pP
35c80 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a  ager = pPager;..
35c90 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f      assert( !isO
35ca0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
35cb0 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  || !MEMDB );.   
35cc0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
35cd0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
35ce0 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20  er->dbSize<pgno 
35cf0 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  || noContent ){.
35d00 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
35d10 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
35d20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
35d30 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
35d40 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
35d50 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
35d60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43   }.      if( noC
35d70 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
35d80 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
35d90 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  set the bits in 
35da0 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  the InJournal bi
35db0 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e  t-vectors is ben
35dc0 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ign..        ** 
35dd0 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20  It merely means 
35de0 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f  that we might do
35df0 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b   some extra work
35e00 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20   to journal a . 
35e10 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74         ** page t
35e20 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
35e30 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65  d to be journale
35e40 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  d.  Nevertheless
35e50 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20  , be sure .     
35e60 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
35e70 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
35e80 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
35e90 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
35ea0 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  to set .        
35eb0 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69  ** a bit in a bi
35ec0 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  t vector..      
35ed0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
35ee0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
35ef0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
35f00 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
35f10 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
35f20 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f  .          TESTO
35f30 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69  NLY( rc = ) sqli
35f40 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
35f50 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
35f60 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
35f70 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
35f80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
35f90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35fa0 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
35fb0 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
35fc0 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
35fd0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
35fe0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
35ff0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
36000 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
36010 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
36020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
36030 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
36040 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
36050 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54  Size);.      IOT
36060 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
36070 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
36080 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
36090 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d  .      u32 iFram
360a0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
360b0 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20         /* Frame 
360c0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c  to read from WAL
360d0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69   file */.      i
360e0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
360f0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
36100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
36110 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
36120 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
36130 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  iFrame);.       
36140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36150 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
36160 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
36170 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
36180 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
36190 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
361a0 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
361b0 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b  GER_STAT_MISS]++
361c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
361d0 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72  dDbPage(pPg, iFr
361e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
361f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36200 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
36210 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
36220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36230 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
36240 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a  ehash(pPg);.  }.
36250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36260 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69  OK;..pager_acqui
36270 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74  re_err:.  assert
36280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36290 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
362a0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
362b0 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a  eDrop(pPg);.  }.
362c0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
362d0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
362e0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
362f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
36300 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
36310 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 54 68 65 20  P_SIZE>0./* The 
36320 70 61 67 65 20 67 65 74 74 65 72 20 66 6f 72 20  page getter for 
36330 77 68 65 6e 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  when memory-mapp
36340 65 64 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65  ed I/O is enable
36350 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d */.static int 
36360 67 65 74 50 61 67 65 4d 4d 61 70 28 0a 20 20 50  getPageMMap(.  P
36370 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
36380 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
36390 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
363a0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
363b0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
363c0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
363d0 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
363e0 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
363f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
36400 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
36410 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
36420 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
36430 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58   /* PAGER_GET_XX
36440 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  X flags */.){.  
36450 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36460 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  OK;.  PgHdr *pPg
36470 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61   = 0;.  u32 iFra
36480 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  me = 0;         
36490 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65          /* Frame
364a0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41   to read from WA
364b0 4c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  L file */..  /* 
364c0 49 74 20 69 73 20 61 63 63 65 70 74 61 62 6c 65  It is acceptable
364d0 20 74 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f   to use a read-o
364e0 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20  nly (mmap) page 
364f0 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65 78 63  for any page exc
36500 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20  ept.  ** page 1 
36510 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  if there is no w
36520 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
36530 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51   open or the ACQ
36540 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  UIRE_READONLY.  
36550 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70 65 63  ** flag was spec
36560 69 66 69 65 64 20 62 79 20 74 68 65 20 63 61 6c  ified by the cal
36570 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67  ler. And so long
36580 20 61 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f   as the db is no
36590 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  t a .  ** tempor
365a0 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ary or in-memory
365b0 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
365c0 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70   const int bMmap
365d0 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31 0a 20 20 20  Ok = (pgno>1.   
365e0 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
365f0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
36600 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47   || (flags & PAG
36610 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29  ER_GET_READONLY)
36620 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ).  );..  assert
36630 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
36640 72 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  r) );.#ifdef SQL
36650 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
36660 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36670 78 43 6f 64 65 63 3d 3d 30 20 29 3b 0a 23 65 6e  xCodec==0 );.#en
36680 64 69 66 0a 0a 20 20 2f 2a 20 4f 70 74 69 6d 69  dif..  /* Optimi
36690 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 41 64  zation note:  Ad
366a0 64 69 6e 67 20 74 68 65 20 22 70 67 6e 6f 3c 3d  ding the "pgno<=
366b0 31 22 20 74 65 72 6d 20 62 65 66 6f 72 65 20 22  1" term before "
366c0 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65 0a 20 20  pgno==0" here.  
366d0 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f  ** allows the co
366e0 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 65 72  mpiler optimizer
366f0 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 72 65   to reuse the re
36700 73 75 6c 74 73 20 6f 66 20 74 68 65 20 22 70 67  sults of the "pg
36710 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65 73 74 20  no>1".  ** test 
36720 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
36730 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20 61  statement, and a
36740 76 6f 69 64 20 74 65 73 74 69 6e 67 20 70 67 6e  void testing pgn
36750 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20 20 2a 2a  o==0 in the.  **
36760 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
36770 72 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65  re pgno is large
36780 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3c  . */.  if( pgno<
36790 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30 20 29 7b  =1 && pgno==0 ){
367a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
367b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
367c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
367d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
367e0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
367f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
36800 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
36810 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
36820 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
36830 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b  SharedLock==1 );
36840 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36850 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
36860 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
36870 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72  bMmapOk && pager
36880 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
36890 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
368a0 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
368b0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
368c0 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
368d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
368e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50  OK ){.      *ppP
368f0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
36900 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
36910 20 20 7d 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f    }.  if( bMmapO
36920 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29  k && iFrame==0 )
36930 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  {.    void *pDat
36940 61 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  a = 0;.    rc = 
36950 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70  sqlite3OsFetch(p
36960 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20  Pager->fd, .    
36970 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31      (i64)(pgno-1
36980 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) * pPager->page
36990 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61  Size, pPager->pa
369a0 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20  geSize, &pData. 
369b0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
369c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
369d0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 69 66  Data ){.      if
369e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
369f0 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c  >PAGER_READER ||
36a00 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
36a10 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  e ){.        pPg
36a20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
36a30 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
36a40 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
36a50 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
36a60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
36a70 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
36a80 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
36a90 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20  pData, &pPg);.  
36aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36ab0 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
36ac0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ch(pPager->fd, (
36ad0 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61  i64)(pgno-1)*pPa
36ae0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
36af0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Data);.      }. 
36b00 20 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a       if( pPg ){.
36b10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
36b30 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
36b40 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20   = pPg;.        
36b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36b70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36b80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
36b90 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
36ba0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
36bb0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
36bc0 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 70 50  getPageNormal(pP
36bd0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61  ager, pgno, ppPa
36be0 67 65 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 23 65  ge, flags);.}.#e
36bf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
36c00 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
36c10 2f 0a 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67  /../* The page g
36c20 65 74 74 65 72 20 6d 65 74 68 6f 64 20 66 6f 72  etter method for
36c30 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
36c40 69 73 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  is an error stat
36c50 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
36c60 67 65 74 50 61 67 65 45 72 72 6f 72 28 0a 20 20  getPageError(.  
36c70 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
36c80 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
36c90 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
36ca0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
36cb0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
36cc0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
36cd0 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
36ce0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
36cf0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
36d00 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
36d10 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
36d20 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
36d30 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
36d40 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
36d50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
36d60 52 28 70 67 6e 6f 29 3b 0a 20 20 55 4e 55 53 45  R(pgno);.  UNUSE
36d70 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67  D_PARAMETER(flag
36d80 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  s);.  assert( pP
36d90 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
36da0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70  QLITE_OK );.  *p
36db0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74  pPage = 0;.  ret
36dc0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
36dd0 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69 73 70  ode;.}.../* Disp
36de0 61 74 63 68 20 61 6c 6c 20 70 61 67 65 20 66 65  atch all page fe
36df0 74 63 68 20 72 65 71 75 65 73 74 73 20 74 6f 20  tch requests to 
36e00 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
36e10 67 65 74 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a  getter method..*
36e20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
36e30 65 72 47 65 74 28 0a 20 20 50 61 67 65 72 20 2a  erGet(.  Pager *
36e40 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
36e50 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
36e60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
36e70 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
36e80 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
36e90 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
36ea0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
36eb0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
36ec0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
36ed0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
36ee0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
36ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
36f00 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67  GER_GET_XXX flag
36f10 73 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53  s */.){.#ifdef S
36f20 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49  QLITE_SERVER_EDI
36f30 54 49 4f 4e 0a 20 20 69 66 28 20 70 61 67 65 72  TION.  if( pager
36f40 49 73 53 65 72 76 65 72 28 70 50 61 67 65 72 29  IsServer(pPager)
36f50 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
36f60 20 73 71 6c 69 74 65 33 53 65 72 76 65 72 4c 6f   sqlite3ServerLo
36f70 63 6b 28 70 50 61 67 65 72 2d 3e 70 53 65 72 76  ck(pPager->pServ
36f80 65 72 2c 20 70 67 6e 6f 2c 20 30 2c 20 30 29 3b  er, pgno, 0, 0);
36f90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
36fa0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
36fb0 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rc;.  }.#endif. 
36fc0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
36fd0 78 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  xGet(pPager, pgn
36fe0 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
36ff0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  );.}../*.** Acqu
37000 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
37010 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
37020 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
37030 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
37040 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
37050 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
37060 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
37070 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
37080 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
37090 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a  t in cache. .**.
370a0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
370b0 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
370c0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
370d0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
370e0 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
370f0 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
37100 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
37110 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
37120 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
37130 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
37140 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
37150 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
37160 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
37170 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
37180 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
37190 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
371a0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
371b0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
371c0 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
371d0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
371e0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
371f0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
37200 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70  sqlite3_pcache_p
37210 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
37220 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
37230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
37240 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o!=0 );.  assert
37250 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  ( pPager->pPCach
37260 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  e!=0 );.  pPage 
37270 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
37280 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
37290 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a  ache, pgno, 0);.
372a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 3d    assert( pPage=
372b0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61  =0 || pPager->ha
372c0 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
372d0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  );.  if( pPage==
372e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
372f0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
37300 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28  acheFetchFinish(
37310 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
37320 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d   pgno, pPage);.}
37330 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
37340 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
37350 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
37360 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
37370 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
37380 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
37390 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
373a0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
373b0 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
373c0 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
373d0 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
373e0 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
373f0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
37400 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
37410 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
37420 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
37430 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
37440 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67  refNotNull(DbPag
37450 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
37460 20 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65   *pPager;.  asse
37470 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20  rt( pPg!=0 );.  
37480 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
37490 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
374a0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d  >flags & PGHDR_M
374b0 4d 41 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MAP ){.    pager
374c0 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70  ReleaseMapPage(p
374d0 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
374e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
374f0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
37500 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
37510 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
37520 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  }.void sqlite3Pa
37530 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
37540 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
37550 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55   ) sqlite3PagerU
37560 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29  nrefNotNull(pPg)
37570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
37580 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
37590 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
375a0 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74  of every write t
375b0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
375c0 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64  here must alread
375d0 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20  y be a RESERVED 
375e0 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
375f0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
37600 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  e .** file when 
37610 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
37620 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70  called..**.** Op
37630 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
37640 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
37650 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61  ager and write a
37660 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
37670 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ** to the start 
37680 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  of it. If there 
37690 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
376a0 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  oints, open the 
376b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61  sub-journal.** a
376c0 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  s well. This fun
376d0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
376e0 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  ed when the jour
376f0 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e  nal file is bein
37700 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20  g .** opened to 
37710 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  write a rollback
37720 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73   log for a trans
37730 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f  action. It is no
37740 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20  t used .** when 
37750 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f  opening a hot jo
37760 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f  urnal file to ro
37770 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
37780 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
37790 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
377a0 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79   open (as it may
377b0 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
377c0 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20   mode),.** then 
377d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75  this function ju
377e0 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72  st writes a jour
377f0 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
37800 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
37810 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66  * already open f
37820 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ile. .**.** Whet
37830 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
37840 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
37850 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  pened by this fu
37860 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50  nction, the.** P
37870 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
37880 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
37890 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a   is allocated..*
378a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
378b0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
378c0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
378d0 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  l. Otherwise, re
378e0 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
378f0 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74  NOMEM if the att
37900 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
37910 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
37920 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
37930 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
37940 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77   if opening or w
37950 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
37960 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a  al file fails..*
37970 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
37980 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
37990 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
379a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
379b0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
379c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
379d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
379e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
379f0 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
37a00 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c  er->pVfs;   /* L
37a10 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66  ocal cache of vf
37a20 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20  s pointer */..  
37a30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37a40 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37a50 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
37a60 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
37a70 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
37a80 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
37a90 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37aa0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f  nal==0 );.  .  /
37ab0 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20  * If already in 
37ac0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
37ad0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
37ae0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  s a no-op.  But 
37af0 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65  on.  ** the othe
37b00 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75  r hand, this rou
37b10 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
37b20 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61  lled if we are a
37b30 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61  lready in.  ** a
37b40 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a  n error state. *
37b50 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
37b60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
37b70 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
37b80 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20  errCode;..  if( 
37b90 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
37ba0 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
37bb0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
37bc0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
37bd0 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  FF ){.    pPager
37be0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
37bf0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
37c00 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
37c10 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
37c20 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
37c30 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
37c40 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
37c50 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  KPT;.    }.  .  
37c60 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
37c70 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
37c80 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
37c90 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  open. */.    if(
37ca0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
37cb0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
37cc0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
37cd0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
37ce0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
37cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
37d00 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
37d10 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
37d20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
37d30 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
37d40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
37d50 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
37d60 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20  EN_CREATE;.     
37d70 20 20 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a     int nSpill;..
37d80 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
37d90 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
37da0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
37db0 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |= (SQLITE_OPEN_
37dc0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51  DELETEONCLOSE|SQ
37dd0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
37de0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20  OURNAL);.       
37df0 20 20 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c 69     nSpill = sqli
37e00 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53  te3Config.nStmtS
37e10 70 69 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  pill;.        }e
37e20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
37e30 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
37e40 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
37e50 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70 69  ;.          nSpi
37e60 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72 53  ll = jrnlBufferS
37e70 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
37e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
37e90 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72   .        /* Ver
37ea0 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74  ify that the dat
37eb0 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20  abase still has 
37ec0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
37ed0 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20   it did when.   
37ee0 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f       ** it was o
37ef0 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64  riginally opened
37f00 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  . */.        rc 
37f10 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  = databaseIsUnmo
37f20 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ved(pPager);.   
37f30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
37f40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37f50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37f60 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20 20  JournalOpen (.  
37f70 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
37f80 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
37f90 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
37fa0 20 66 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a 20   flags, nSpill. 
37fb0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
37fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
37fd0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
37fe0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
37ff0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
38000 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a   );.    }.  .  .
38010 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
38020 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
38030 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
38040 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
38050 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
38060 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
38070 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
38080 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
38090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
380a0 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
380b0 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
380c0 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
380d0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  d. */.      pPag
380e0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
380f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
38100 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
38110 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
38120 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
38130 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
38140 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  r = 0;.      rc 
38150 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
38160 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
38170 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
38180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
38190 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
381a0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
381b0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
381c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
381d0 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  l = 0;.  }else{.
381e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
381f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
38200 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
38210 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
38220 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
38230 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20  ITER_CACHEMOD;. 
38240 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
38250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
38260 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
38270 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
38280 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
38290 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
382a0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
382b0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
382c0 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
382d0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
382e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
382f0 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
38300 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
38310 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
38320 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
38330 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
38340 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
38350 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
38360 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
38370 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
38380 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
38390 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
383a0 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
383b0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
383c0 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
383d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a  *.** If the subj
383e0 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
383f0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
38400 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72  hen any sub-jour
38410 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69  nal opened.** wi
38420 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
38430 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70  ction will be op
38440 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
38450 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a  mory file. This.
38460 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ** has no effect
38470 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   if the sub-jour
38480 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f  nal is already o
38490 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79  pened (as it may
384a0 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e   be when.** runn
384b0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
384c0 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65   mode) or if the
384d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65   transaction doe
384e0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  s not require a.
384f0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ** sub-journal. 
38500 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
38510 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
38520 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72  zero, then any r
38530 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a  equired.** sub-j
38540 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d  ournal is implem
38550 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  ented in-memory 
38560 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20  if pPager is an 
38570 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
38580 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67  se, .** or using
38590 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
385a0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
385b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
385c0 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
385d0 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c  ger, int exFlag,
385e0 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   int subjInMemor
385f0 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  y){.  int rc = S
38600 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
38610 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
38620 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
38630 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73  ->errCode;.  ass
38640 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
38650 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
38660 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
38670 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20  ate<PAGER_ERROR 
38680 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62  );.  pPager->sub
38690 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29  jInMemory = (u8)
386a0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20  subjInMemory;.. 
386b0 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67   if( ALWAYS(pP