/ Hex Artifact Content
Login

Artifact abe022cd72e112a05db5fd1d6d46f5ed93284247:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a      0x01      /*
52b0: 20 4e 65 76 65 72 20 73 70 69 6c 6c 20 63 61 63   Never spill cac
52c0: 68 65 2e 20 20 53 65 74 20 76 69 61 20 70 72 61  he.  Set via pra
52d0: 67 6d 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  gma */.#define S
52e0: 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
52f0: 4b 20 20 20 20 30 78 30 32 20 20 20 20 20 20 2f  K    0x02      /
5300: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5310: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5320: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5330: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5340: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 20 20  YNC      0x04   
5350: 20 20 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20 6f     /* Spill is o
5360: 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73 79  k, but do not sy
5370: 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  nc */../*.** An 
5380: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
5390: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
53a0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e 20  f struct Pager. 
53b0: 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  A description of
53c0: 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  .** some of the 
53d0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d  more important m
53e0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
53f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65  follows:.**.** e
5400: 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  State.**.**   Th
5410: 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74 65  e current 'state
5420: 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  ' of the pager o
5430: 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20 63  bject. See the c
5440: 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65  omment and state
5450: 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62  .**   diagram ab
5460: 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72 69  ove for a descri
5470: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ption of the pag
5480: 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  er state..**.** 
5490: 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  eLock.**.**   Fo
54a0: 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b  r a real on-disk
54b0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
54c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
54d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
54e0: 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f   file -.**   NO_
54f0: 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
5500: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
5510: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
5520: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  CK..**.**   For 
5530: 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
5540: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5550: 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68  e (neither of wh
5560: 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a  ich require any.
5570: 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69  **   locks), thi
5580: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  s variable is al
5590: 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c  ways set to EXCL
55a0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63  USIVE_LOCK. Sinc
55b0: 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61  e such.**   data
55c0: 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61 76  bases always hav
55d0: 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76  e Pager.exclusiv
55e0: 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74  eMode==1, this t
55f0: 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a  ricks the pager.
5600: 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20  **   logic into 
5610: 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74  thinking that it
5620: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c   already has all
5630: 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69   the locks it wi
5640: 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65  ll ever.**   nee
5650: 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e  d (and no reason
5660: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d   to release them
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f  )..**.**   In so
5680: 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69 72  me (obscure) cir
5690: 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73  cumstances, this
56a0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c   variable may al
56b0: 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20  so be set to.** 
56c0: 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20    UNKNOWN_LOCK. 
56d0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
56e0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
56f0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
5700: 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69  K for.**   detai
5710: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65  ls..**.** change
5720: 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20  CountDone.**.** 
5730: 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76    This boolean v
5740: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
5750: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
5760: 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  t the change-cou
5770: 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20  nter .**   (the 
5780: 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 69  4-byte header fi
5790: 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66 73  eld at byte offs
57a0: 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61 74  et 24 of the dat
57b0: 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a  abase file) is .
57c0: 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64  **   not updated
57d0: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
57e0: 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a   necessary. .**.
57f0: 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20 74  **   It is set t
5800: 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  o true when the 
5810: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
5820: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
5830: 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e   which .**   can
5840: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
5850: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5860: 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
5870: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
5880: 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61 72  **   It is clear
5890: 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65  ed (set to false
58a0: 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78  ) whenever an ex
58b0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
58c0: 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68  .**   relinquish
58d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
58e0: 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69  se file. Each ti
58f0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
5900: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a   is committed,.*
5910: 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f  *   The changeCo
5920: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
5930: 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69 74  inspected. If it
5940: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f   is true, the wo
5950: 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74  rk of.**   updat
5960: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
5970: 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65  ounter is omitte
5980: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
5990: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
59a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68  *.**   This mech
59b0: 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74  anism means that
59c0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
59d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
59e0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a   a connection .*
59f0: 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70  *   need only up
5a00: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
5a10: 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f  counter once, fo
5a20: 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61 6e  r the first tran
5a30: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d  saction.**   com
5a40: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65  mitted..**.** se
5a50: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
5a60: 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74  When PagerCommit
5a70: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
5a80: 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61  lled to commit a
5a90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
5aa0: 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61   may.**   (or ma
5ab0: 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61  y not) specify a
5ac0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5ad0: 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74  name to be writt
5ae0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
5af0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62    journal file b
5b00: 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63  efore it is sync
5b10: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
5b20: 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e  *   Whether or n
5b30: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ot a journal fil
5b40: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  e contains a mas
5b50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b60: 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20  ter affects .** 
5b70: 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68 69    the way in whi
5b80: 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ch the journal f
5b90: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ba0: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
5bb0: 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20  action is .**   
5bc0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
5bd0: 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75  led back when ru
5be0: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5bf0: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
5c00: 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20  mode..**   If a 
5c10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
5c20: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
5c30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
5c40: 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a  ointer, it is.**
5c50: 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20     finalized by 
5c60: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c70: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
5c80: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5c90: 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65  . If.**   it doe
5ca0: 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  s contain a mast
5cb0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5cc0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
5cd0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ce0: 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61   .**   by trunca
5cf0: 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20  ting it to zero 
5d00: 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69  bytes, just as i
5d10: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
5d20: 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e   were .**   runn
5d30: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5d40: 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d  mode=truncate" m
5d50: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75  ode..**.**   Jou
5d60: 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20  rnal files that 
5d70: 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a  contain master j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
5d90: 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69  cannot be finali
5da0: 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20  zed.**   simply 
5db0: 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  by overwriting t
5dc0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
5dd0: 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72  -header with zer
5de0: 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20  oes, as the.**  
5df0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e00: 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e  pointer could in
5e10: 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f 74  terfere with hot
5e20: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
5e30: 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75  k of any.**   su
5e40: 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72  bsequently inter
5e50: 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74 69  rupted transacti
5e60: 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20 74  on that reuses t
5e70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61  .**.**   The fla
5e90: 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73 20  g is cleared as 
5ea0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72  soon as the jour
5eb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61  nal file is fina
5ec0: 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a  lized (either.**
5ed0: 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69     by PagerCommi
5ee0: 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67  tPhaseTwo or Pag
5ef0: 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20  erRollback). If 
5f00: 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76  an IO error prev
5f10: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f  ents the.**   jo
5f20: 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  urnal file from 
5f30: 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c  being successful
5f40: 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  ly finalized, th
5f50: 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67  e setMaster flag
5f60: 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64  .**   is cleared
5f70: 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65   anyway (and the
5f80: 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65   pager will move
5f90: 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29   to ERROR state)
5fa0: 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69  ..**.** doNotSpi
5fb0: 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ll.**.**   This 
5fc0: 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f  variables contro
5fd0: 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  l the behavior o
5fe0: 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20 20  f cache-spills  
5ff0: 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a 2a  (calls made by.*
6000: 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20 6d  *   the pcache m
6010: 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67  odule to the pag
6020: 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74 69  erStress() routi
6030: 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63 68  ne to write cach
6040: 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f 20  ed data.**   to 
6050: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
6060: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  in order to free
6070: 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a   up memory)..**.
6080: 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20 53  **   When bits S
6090: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72 20  PILLFLAG_OFF or 
60a0: 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
60b0: 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c 6c  CK of doNotSpill
60c0: 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20 77   are set,.**   w
60d0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
60e0: 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67 65  tabase from page
60f0: 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69 73  rStress() is dis
6100: 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65 72  abled altogether
6110: 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c 4c  ..**   The SPILL
6120: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63 61  FLAG_ROLLBACK ca
6130: 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61 20  se is done in a 
6140: 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61 73  very obscure cas
6150: 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d 65  e that.**   come
6160: 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76 65  s up during save
6170: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 74  point rollback t
6180: 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
6190: 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a 2a   pcache module.*
61a0: 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  *   to allocate 
61b0: 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70 72  a new page to pr
61c0: 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  event the journa
61d0: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
61e0: 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 77  g written.**   w
61f0: 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e 67  hile it is being
6200: 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63 6f   traversed by co
6210: 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  de in pager_play
6220: 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50 49  back().  The SPI
6230: 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20 20  LLFLAG_OFF.**   
6240: 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20 70  case is a user p
6250: 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a  reference..** .*
6260: 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c 4c  *   If the SPILL
6270: 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74 20  FLAG_NOSYNC bit 
6280: 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67 20  is set, writing 
6290: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
62a0: 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73  from pagerStress
62b0: 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69  ().**   is permi
62c0: 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e  tted, but syncin
62d0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
62e0: 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20  le is not. This 
62f0: 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20  flag is set.**  
6300: 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
6310: 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68 65  Write() when the
6320: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
6330: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
6340: 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65  er than.**   the
6350: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73   database page-s
6360: 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ize in order to 
6370: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
6380: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
6390: 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62  ening .**   in b
63a0: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63b0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63c0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63d0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63f0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
6400: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6410: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6420: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6430: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6440: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6450: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6460: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6470: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6480: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6490: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
64a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64b0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64c0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64d0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64e0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64f0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
6500: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6510: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6520: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6530: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6540: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6550: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6560: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6570: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6590: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
65a0: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65b0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65c0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65d0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65e0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65f0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
6600: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6610: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6620: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6630: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6640: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6650: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6660: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6670: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6680: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6690: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
66a0: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66b0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66c0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66d0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66e0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66f0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
6700: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6710: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6720: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6730: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6740: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6750: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6760: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6770: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6780: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6790: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
67a0: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67b0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67c0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67d0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67e0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67f0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
6800: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6810: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6820: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6830: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6840: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6850: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6860: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6870: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6880: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6890: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
68a0: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68b0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68c0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68d0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68e0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68f0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
6900: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6910: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6920: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6930: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6940: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6950: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6960: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6970: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6980: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6990: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
69a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69b0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69c0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69d0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69f0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
6a00: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a10: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a30: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a40: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a50: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a60: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a70: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a80: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a90: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6aa0: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6ab0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ac0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ad0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ae0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6af0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6b00: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b10: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b30: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b40: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b50: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b60: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b70: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b80: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b90: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6ba0: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6bb0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bc0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bd0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6be0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6bf0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6c00: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c10: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c20: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c30: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c40: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c50: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c60: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c70: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c80: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c90: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6ca0: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6cb0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cc0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cd0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6ce0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6cf0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6d00: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d10: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d20: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d40: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d50: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d60: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d70: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d80: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d90: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6da0: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6db0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6dc0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dd0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6de0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6df0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6e00: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e10: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e20: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e30: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e40: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e50: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e60: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e70: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e80: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e90: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6ea0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6eb0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6ec0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ed0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ee0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ef0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6f00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f10: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f20: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f30: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f40: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f50: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f60: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f70: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f80: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f90: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6fa0: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fb0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fc0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fd0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fe0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6ff0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
7000: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7010: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7020: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7030: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7040: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7050: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7060: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7070: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7080: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7090: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
70a0: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70b0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70c0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70d0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70e0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70f0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
7100: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7110: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7120: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7130: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7140: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7150: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7160: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7170: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7180: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7190: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
71a0: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71b0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71c0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71d0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71e0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71f0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
7200: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7210: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7220: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7240: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7250: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7260: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7270: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7280: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7290: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
72a0: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72b0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72d0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72f0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
7300: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7320: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7330: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7340: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7350: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7360: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7370: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7380: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7390: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
73a0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73b0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73c0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73d0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73e0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
7400: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7410: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7420: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7430: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7440: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7450: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7460: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7470: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7490: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
74a0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74b0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74d0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74e0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74f0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7550: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7560: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7570: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7580: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7590: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
75a0: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75b0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75c0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75d0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75e0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75f0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
7600: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7610: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7620: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7630: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7640: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7650: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7660: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7680: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7690: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
76a0: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76b0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76c0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76d0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76e0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76f0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
7700: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7710: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7720: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7750: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7760: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7770: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
77a0: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77b0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77c0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77e0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77f0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
7800: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7810: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7820: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7830: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7840: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7850: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7860: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7870: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7880: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7890: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
78a0: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78b0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78c0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78d0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78e0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78f0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
7900: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7910: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7920: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7950: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7960: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7970: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
7980: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
7990: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
79a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
79b0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
79c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
79d0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
79e0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
79f0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7a00: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7a10: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7a20: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7a30: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7a40: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7a60: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7a70: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
7a80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
7ab0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
7ac0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
7ad0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7ae0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7af0: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7b00: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7b10: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7b20: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7b30: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7b40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7b50: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7b60: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7b70: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
7b80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
7b90: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
7ba0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
7bb0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7bc0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7bd0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7be0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7bf0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7c00: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7c10: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7c20: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7c30: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7c40: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7c50: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
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 73 75 62 2d 6a  riptor for sub-j
7c80: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7c90: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ca0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7cb0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7cc0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7cd0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7ce0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7cf0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7d00: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7d10: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7d20: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7d30: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7d40: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7d50: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7d60: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7d70: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7d80: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7d90: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7da0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7db0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7dc0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7dd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7de0: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7df0: 6e 74 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 6e 52  nt[] */.  u32 nR
7e00: 65 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  eset;           
7e10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7e20: 6f 66 20 63 61 6c 6c 73 20 74 6f 20 70 61 67 65  of calls to page
7e30: 72 5f 72 65 73 65 74 28 29 20 2a 2f 0a 20 20 63  r_reset() */.  c
7e40: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
7e50: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
7e60: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
7e70: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
7e80: 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  nges */..  int n
7e90: 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20  MmapOut;        
7ea0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7eb0: 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63   of mmap pages c
7ec0: 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e  urrently outstan
7ed0: 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ding */.  sqlite
7ee0: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20  3_int64 szMmap; 
7ef0: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64        /* Desired
7f00: 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69   maximum mmap si
7f10: 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ze */.  PgHdr *p
7f20: 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20  MmapFreelist;   
7f30: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
7f40: 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65  ree mmap page he
7f50: 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a  aders (pDirty) *
7f60: 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20  /.  /*.  ** End 
7f70: 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79  of the routinely
7f80: 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20  -changing class 
7f90: 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a  members.  ******
7fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fe0: 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  *****/..  u16 nE
7ff0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
8000: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
8010: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
8020: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
8030: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
8040: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
8050: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8060: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
8070: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
8080: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
8090: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
80a0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
80b0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
80c0: 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65  en() */.  u32 se
80d0: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
80e0: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
80f0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
8100: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
8110: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8130: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
8140: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
8150: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
8160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
8170: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
8180: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
8190: 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ase */.  i64 jou
81a0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
81b0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
81c0: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
81d0: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
81e0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
81f0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
8200: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8210: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
8220: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
8230: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
8240: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
8250: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
8260: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
8270: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
8280: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
8290: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
82a0: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
82b0: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
82c0: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
82d0: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
82e0: 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33  */.  int aStat[3
82f0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
8300: 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20   /* Total cache 
8310: 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64  hits, misses and
8320: 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65   writes */.#ifde
8330: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
8340: 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20  int nRead;      
8350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
8360: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
8370: 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  ad */.#endif.  v
8380: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
8390: 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61  (DbPage*); /* Ca
83a0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
83b0: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
83c0: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
83d0: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
83e0: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
83f0: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
8400: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
8410: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
8420: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
8430: 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
8440: 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
8450: 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f  nt); /* Notify o
8460: 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e  f page size chan
8470: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
8480: 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
8490: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
84a0: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
84b0: 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20  r the codec */. 
84c0: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20   void *pCodec;  
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
84e0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
84f0: 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68  o xCodec... meth
8500: 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ods */.#endif.  
8510: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
8520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8530: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
8540: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
8550: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43   tmp use */.  PC
8560: 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20  ache *pPCache;  
8570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8580: 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63  nter to page cac
8590: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66  he object */.#if
85a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
85b0: 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c  _WAL.  Wal *pWal
85c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
85d0: 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61     /* Write-ahea
85e0: 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a  d log used by "j
85f0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22  ournal_mode=wal"
8600: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c   */.  char *zWal
8610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8620: 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66    /* File name f
8630: 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  or write-ahead l
8640: 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  og */.#endif.};.
8650: 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66  ./*.** Indexes f
8660: 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65  or use with Page
8670: 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50  r.aStat[]. The P
8680: 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72  ager.aStat[] arr
8690: 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  ay contains.** t
86a0: 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73  he values access
86b0: 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51  ed by passing SQ
86c0: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
86d0: 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d  CHE_HIT, CACHE_M
86e0: 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45  ISS .** or CACHE
86f0: 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65  _WRITE to sqlite
8700: 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a  3_db_status()..*
8710: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
8720: 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65  STAT_HIT   0.#de
8730: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
8740: 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20  MISS  1.#define 
8750: 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
8760: 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f   2../*.** The fo
8770: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
8780: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
8790: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
87a0: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
87b0: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
87c0: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
87d0: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
87e0: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
87f0: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
8800: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
8810: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
8820: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
8830: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8840: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
8850: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8860: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
8870: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
8880: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8890: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
88a0: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
88b0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
88c0: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
88d0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88e0: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
88f0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8900: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
8910: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20  to journal */.# 
8920: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
8930: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
8940: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
8950: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
8960: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
8970: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
8980: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
8990: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
89a0: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
89b0: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
89c0: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
89d0: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
89e0: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
89f0: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
8a00: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
8a10: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
8a20: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
8a30: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
8a40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
8a50: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
8a60: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
8a70: 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  nal is being.** 
8a80: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
8a90: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
8aa0: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
8ab0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
8ac0: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
8ad0: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
8ae0: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
8af0: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
8b00: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
8b10: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
8b20: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
8b30: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
8b40: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
8b50: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
8b60: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
8b70: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
8b80: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
8b90: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
8ba0: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
8bb0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
8bc0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
8bd0: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
8be0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
8bf0: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
8c00: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
8c10: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
8c20: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
8c30: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
8c40: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
8c50: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
8c60: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
8c70: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
8c80: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
8c90: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
8ca0: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
8cb0: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
8cc0: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
8cd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
8ce0: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
8cf0: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
8d00: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
8d10: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
8d20: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
8d30: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
8d40: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
8d50: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
8d60: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
8d70: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
8d80: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
8d90: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
8da0: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
8db0: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
8dc0: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
8dd0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
8de0: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
8df0: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
8e00: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
8e10: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
8e20: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
8e30: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
8e40: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
8e50: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
8e60: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
8e70: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
8e80: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
8e90: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
8ea0: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
8eb0: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
8ec0: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
8ed0: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
8ee0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
8ef0: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65   of each page re
8f00: 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  cord in the jour
8f10: 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a  nal is given by.
8f20: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
8f30: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69   macro..*/.#defi
8f40: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
8f50: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
8f60: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
8f70: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
8f80: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
8f90: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
8fa0: 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
8fb0: 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73  y the same .** s
8fc0: 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ize as a single 
8fd0: 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65  disk sector. See
8fe0: 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53   also setSectorS
8ff0: 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ize()..*/.#defin
9000: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
9010: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
9020: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
9030: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
9040: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
9050: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
9060: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
9070: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
9080: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
9090: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
90a0: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
90b0: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
90c0: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
90d0: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
90e0: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
90f0: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
9100: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
9110: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
9120: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
9130: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
9140: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
9150: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
9160: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
9170: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
9180: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
9190: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55  *.** The macro U
91a0: 53 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20  SEFETCH is true 
91b0: 69 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65  if we are allowe
91c0: 64 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65  d to use the xFe
91d0: 74 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68  tch and xUnfetch
91e0: 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74  .** interfaces t
91f0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
9200: 61 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f  abase using memo
9210: 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a  ry-mapped I/O..*
9220: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
9230: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64  _MMAP_SIZE>0.# d
9240: 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78  efine USEFETCH(x
9250: 29 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63  ) ((x)->bUseFetc
9260: 68 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  h).#else.# defin
9270: 65 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a  e USEFETCH(x) 0.
9280: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
9290: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
92a0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
92b0: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
92c0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
92d0: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
92e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
92f0: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
9300: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
9310: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
9320: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
9330: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
9340: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
9350: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
9360: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
9370: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
9380: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
9390: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
93a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
93b0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
93c0: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
93d0: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
93e0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
93f0: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
9400: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
9410: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
9420: 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a  )->pMethods)../*
9430: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
9440: 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73  if this pager us
9450: 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64  es a write-ahead
9460: 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20   log instead of 
9470: 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c  the usual.** rol
9480: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f  lback journal. O
9490: 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a  therwise false..
94a0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
94b0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69  E_OMIT_WAL.stati
94c0: 63 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61  c int pagerUseWa
94d0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
94e0: 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  {.  return (pPag
94f0: 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a  er->pWal!=0);.}.
9500: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
9510: 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a  agerUseWal(x) 0.
9520: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f  # define pagerRo
9530: 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23  llbackWal(x) 0.#
9540: 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c   define pagerWal
9550: 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20  Frames(v,w,x,y) 
9560: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9570: 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
9580: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (z) SQLITE_OK.# 
9590: 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69  define pagerBegi
95a0: 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
95b0: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (z) SQLITE_OK.#e
95c0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
95d0: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67  EBUG ./*.** Usag
95e0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  e:.**.**   asser
95f0: 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
9600: 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
9610: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9620: 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61  tion runs many a
9630: 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f  sserts to try to
9640: 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65   find inconsiste
9650: 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ncies in.** the 
9660: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
9670: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
9680: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
9690: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
96a0: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
96b0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
96c0: 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65  = p;..  /* State
96d0: 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20   must be valid. 
96e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
96f0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
9700: 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  EN.       || p->
9710: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
9720: 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70  ADER.       || p
9730: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9740: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
9750: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9760: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9770: 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
9780: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9790: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
97a0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
97b0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
97c0: 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20  ER_FINISHED.    
97d0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
97e0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29  =PAGER_ERROR.  )
97f0: 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65  ;..  /* Regardle
9800: 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ss of the curren
9810: 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d  t state, a temp-
9820: 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  file connection 
9830: 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20  always behaves. 
9840: 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73   ** as if it has
9850: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
9860: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
9870: 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65  se file. It neve
9880: 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74  r updates.  ** t
9890: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
98a0: 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20  r field, so the 
98b0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
98c0: 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73  flag is always s
98d0: 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
98e0: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
98f0: 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  0 || p->eLock==E
9900: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
9910: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
9920: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
9930: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9940: 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Done );..  /* If
9950: 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20   the useJournal 
9960: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  flag is clear, t
9970: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9980: 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a  must be "OFF". .
9990: 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
99a0: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
99b0: 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e  "OFF", the journ
99c0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74  al file must not
99d0: 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   be open..  */. 
99e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
99f0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9a00: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9a10: 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  | p->useJournal 
9a20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9a30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
9a40: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9a50: 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d  FF || !isOpen(p-
9a60: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9a70: 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20  heck that MEMDB 
9a80: 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20  implies noSync. 
9a90: 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  And an in-memory
9aa0: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
9ab0: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73  .  ** this means
9ac0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9ad0: 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20  ger performs no 
9ae0: 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61  IO at all, it ca
9af0: 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a  nnot encounter .
9b00: 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49    ** either SQLI
9b10: 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
9b20: 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72  TE_FULL during r
9b30: 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65  ollback or while
9b40: 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a   finalizing .  *
9b50: 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * a journal file
9b60: 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20  . (although the 
9b70: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9b80: 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  l implementation
9b90: 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72   may .  ** retur
9ba0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
9bb0: 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a  OMEM while the j
9bc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
9bd0: 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49  eing written). I
9be0: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65  t .  ** is there
9bf0: 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c  fore not possibl
9c00: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
9c10: 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  ry pager to ente
9c20: 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a  r the ERROR .  *
9c30: 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  * state..  */.  
9c40: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
9c50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
9c60: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
9c70: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9c80: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9c90: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
9ca0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9cb0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9cc0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
9cd0: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
9ce0: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
9cf0: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
9d00: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
9d10: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9d20: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
9d30: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
9d40: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
9d50: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
9d60: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
9d70: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
9d80: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
9d90: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9da0: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
9db0: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
9dc0: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
9dd0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
9de0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
9df0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
9e00: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
9e10: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
9e20: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
9e30: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
9e40: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
9e50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9e60: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9e70: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9e80: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
9e90: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
9ea0: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
9eb0: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
9ec0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
9ed0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9ee0: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
9ef0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9f00: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9f10: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9f20: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9f30: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9f40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9f50: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
9f60: 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  CK );.      brea
9f70: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f80: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
9f90: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9fa0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9fb0: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
9fc0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9fd0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9fe0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
9ff0: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a000: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
a010: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a020: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a030: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a040: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a050: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
a060: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
a070: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a080: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a090: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a0a0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a0b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a0c0: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a0d0: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a0e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a0f0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a100: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a110: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a120: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a130: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a140: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a150: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a160: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a170: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a180: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a190: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a1a0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a1b0: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a1c0: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a1d0: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a1e0: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a1f0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a200: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a210: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a220: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a230: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a240: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a250: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a260: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a270: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a280: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a290: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a2a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a2b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a2c0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a2d0: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a2e0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a2f0: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a300: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a310: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a320: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a330: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a340: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a350: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a360: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
a370: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a380: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a390: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a3a0: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a3b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a3c0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a3d0: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a3e0: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a3f0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a400: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
a410: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a420: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a430: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a440: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a450: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a460: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a470: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a480: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a490: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a4a0: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a4b0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a4c0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a4d0: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a4e0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a4f0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a500: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a510: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a520: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a530: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a540: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a550: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a560: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a570: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a590: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a5a0: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a5b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a5c0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a5d0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a5e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a5f0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a600: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a610: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a620: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a630: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a640: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a650: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a660: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a670: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a680: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a690: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a6a0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a6b0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a6c0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a6d0: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a6e0: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a6f0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a700: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a710: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a720: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a730: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a740: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a750: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a760: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a770: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a780: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a790: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a7a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a7b0: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a7c0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a7d0: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a7e0: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a7f0: 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20  pPCache)>0 );.  
a800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
a810: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
a820: 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e  ndif /* ifndef N
a830: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
a840: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f   SQLITE_DEBUG ./
a850: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
a860: 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e  inter to a human
a870: 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67   readable string
a880: 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66   in a static buf
a890: 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  fer.** containin
a8a0: 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  g the state of t
a8b0: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
a8c0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
a8d0: 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69  ument. This.** i
a8e0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
a8f0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62   used within deb
a900: 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d  uggers. For exam
a910: 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72  ple, as an alter
a920: 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72  native.** to "pr
a930: 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20  int *pPager" in 
a940: 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29  gdb:.**.** (gdb)
a950: 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72   printf "%s", pr
a960: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
a970: 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69  pPager).*/.stati
a980: 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61  c char *print_pa
a990: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
a9a0: 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *p){.  static ch
a9b0: 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a  ar zRet[1024];..
a9c0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a9d0: 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20  tf(1024, zRet,. 
a9e0: 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20       "Filename: 
a9f0: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
aa00: 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20   "State:        
aa10: 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e   %s errCode=%d\n
aa20: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20  ".      "Lock:  
aa30: 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20          %s\n".  
aa40: 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64      "Locking mod
aa50: 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  e:  locking_mode
aa60: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%s\n".      "Jo
aa70: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75  urnal mode:  jou
aa80: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  rnal_mode=%s\n".
aa90: 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73        "Backing s
aaa0: 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25  tore: tempFile=%
aab0: 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f  d memDb=%d useJo
aac0: 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20  urnal=%d\n".    
aad0: 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20    "Journal:     
aae0: 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c    journalOff=%ll
aaf0: 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c  d journalHdr=%ll
ab00: 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65  d\n".      "Size
ab10: 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a  :          dbsiz
ab20: 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d  e=%d dbOrigSize=
ab30: 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64  %d dbFileSize=%d
ab40: 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a  \n".      , p->z
ab50: 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c  Filename.      ,
ab60: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ab70: 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  R_OPEN          
ab80: 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20    ? "OPEN" :.   
ab90: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
aba0: 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20  PAGER_READER    
abb0: 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22        ? "READER"
abc0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
abd0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
abe0: 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57  ER_LOCKED   ? "W
abf0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a  RITER_LOCKED" :.
ac00: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ac10: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
ac20: 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54  CACHEMOD ? "WRIT
ac30: 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20  ER_CACHEMOD" :. 
ac40: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ac50: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
ac60: 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45  BMOD    ? "WRITE
ac70: 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20  R_DBMOD" :.     
ac80: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
ac90: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
aca0: 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49  HED ? "WRITER_FI
acb0: 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20  NISHED" :.      
acc0: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
acd0: 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20  ER_ERROR        
ace0: 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22     ? "ERROR" : "
acf0: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
ad00: 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65   (int)p->errCode
ad10: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63  .      , p->eLoc
ad20: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20  k==NO_LOCK      
ad30: 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a     ? "NO_LOCK" :
ad40: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
ad50: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
ad60: 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20     ? "RESERVED" 
ad70: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
ad80: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
ad90: 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45  CK  ? "EXCLUSIVE
ada0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
adb0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
adc0: 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22  K     ? "SHARED"
add0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
ade0: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
adf0: 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22  K    ? "UNKNOWN"
ae00: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ae10: 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76     , p->exclusiv
ae20: 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69  eMode ? "exclusi
ae30: 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20  ve" : "normal". 
ae40: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
ae50: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ae60: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
ae70: 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20    ? "memory" :. 
ae80: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
ae90: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aea0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
aeb0: 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20    ? "off" :.    
aec0: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
aed0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
aee0: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f  LMODE_DELETE   ?
aef0: 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20   "delete" :.    
af00: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
af10: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
af20: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f  LMODE_PERSIST  ?
af30: 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20   "persist" :.   
af40: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
af50: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
af60: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
af70: 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20  ? "truncate" :. 
af80: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
af90: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
afa0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
afb0: 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72    ? "wal" : "?er
afc0: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
afd0: 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20  nt)p->tempFile, 
afe0: 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28  (int)p->memDb, (
aff0: 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61  int)p->useJourna
b000: 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  l.      , p->jou
b010: 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72  rnalOff, p->jour
b020: 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28  nalHdr.      , (
b030: 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28  int)p->dbSize, (
b040: 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a  int)p->dbOrigSiz
b050: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c  e, (int)p->dbFil
b060: 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65  eSize.  );..  re
b070: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
b080: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
b090: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
b0a0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
b0b0: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
b0c0: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
b0d0: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
b0e0: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
b0f0: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b100: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
b110: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
b120: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
b130: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
b140: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
b150: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
b160: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
b170: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
b180: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
b190: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
b1a0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
b1b0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b1c0: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
b1d0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
b1e0: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
b1f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
b200: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
b210: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
b220: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
b230: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65  ->pPager;.  Page
b240: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20  rSavepoint *p;. 
b250: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
b260: 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b  ->pgno;.  int i;
b270: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
b280: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
b290: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
b2a0: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
b2b0: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
b2c0: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
b2d0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
b2e0: 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76  ecTest(p->pInSav
b2f0: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
b300: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b320: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
b330: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
b340: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
b350: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
b360: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
b370: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
b380: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
b390: 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
b3a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b3b0: 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
b3c0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
b3d0: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
b3e0: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
b3f0: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
b400: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
b410: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
b420: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
b430: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
b440: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
b450: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
b460: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
b470: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
b480: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
b490: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
b4a0: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
b4b0: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
b4c0: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
b4d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
b4e0: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
b4f0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
b500: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
b510: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
b520: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
b530: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
b540: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
b550: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
b560: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b570: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
b580: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
b590: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
b5a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b5b0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b5c0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
b5d0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
b5e0: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
b5f0: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
b600: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
b610: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
b620: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a  e((u8*)A,B).../*
b630: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
b640: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
b650: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
b660: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
b670: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
b680: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
b690: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
b6a0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
b6b0: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
b6c0: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73  nt write32bits(s
b6d0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
b6e0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
b6f0: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
b700: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
b710: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
b720: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
b730: 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66  te(fd, ac, 4, of
b740: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
b750: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
b760: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65  ase file to leve
b770: 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d  l eLock, which m
b780: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
b790: 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52  _LOCK.** or SHAR
b7a0: 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c  ED_LOCK. Regardl
b7b0: 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
b7c0: 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20 74  r not the call t
b7d0: 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73  o xUnlock().** s
b7e0: 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68 65  ucceeds, set the
b7f0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
b800: 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20 74  iable to match t
b810: 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20 6e  he (attempted) n
b820: 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45  ew lock..**.** E
b830: 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e  xcept, if Pager.
b840: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
b850: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65  UNKNOWN_LOCK whe
b860: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
b870: 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f  is.** called, do
b880: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e 20   not modify it. 
b890: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
b8a0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
b8b0: 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e  e of .** UNKNOWN
b8c0: 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
b8d0: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69 73  lanation of this
b8e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b8f0: 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61  pagerUnlockDb(Pa
b900: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
b910: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72   eLock){.  int r
b920: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
b930: 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
b940: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
b950: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
b960: 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73  k==eLock );.  as
b970: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f  sert( eLock==NO_
b980: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53  LOCK || eLock==S
b990: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
b9a0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e  assert( eLock!=N
b9b0: 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55  O_LOCK || pagerU
b9c0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
b9d0: 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
b9e0: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
b9f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
ba00: 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b  er->eLock>=eLock
ba10: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   );.    rc = pPa
ba20: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
ba30: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
ba40: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
ba50: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
ba60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
ba70: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
ba80: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
ba90: 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65  r->eLock = (u8)e
baa0: 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Lock;.    }.    
bab0: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
bac0: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
bad0: 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20  r, eLock)).  }. 
bae0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
baf0: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61  *.** Lock the da
bb00: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
bb10: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
bb20: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
bb30: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a   SHARED_LOCK,.**
bb40: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
bb50: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
bb60: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  . If the caller 
bb70: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  is successful, s
bb80: 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  et the.** Pager.
bb90: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
bba0: 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  o the new lockin
bbb0: 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20  g state. .**.** 
bbc0: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
bbd0: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
bbe0: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
bbf0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
bc00: 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20   is .** called, 
bc10: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
bc20: 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20   unless the new 
bc30: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73  locking state is
bc40: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
bc50: 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d   .** See the com
bc60: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
bc70: 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57  define of UNKNOW
bc80: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
bc90: 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66  planation .** of
bca0: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
bcb0: 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62   int pagerLockDb
bcc0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bcd0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
bce0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bcf0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  ;..  assert( eLo
bd00: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
bd10: 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  || eLock==RESERV
bd20: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
bd30: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
bd40: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
bd50: 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c  ->eLock<eLock ||
bd60: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
bd70: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
bd80: 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
bd90: 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45  >noLock ? SQLITE
bda0: 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c  _OK : sqlite3OsL
bdb0: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
bdc0: 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  eLock);.    if( 
bdd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
bde0: 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21   (pPager->eLock!
bdf0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65  =UNKNOWN_LOCK||e
be00: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
be10: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70  LOCK) ){.      p
be20: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
be30: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  u8)eLock;.      
be40: 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
be50: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
be60: 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20   eLock)).    }. 
be70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
be80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
be90: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
bea0: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
beb0: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
bec0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
bed0: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
bee0: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
bef0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bf00: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
bf10: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
bf20: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
bf30: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
bf40: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
bf50: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
bf60: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
bf70: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
bf80: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
bf90: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
bfa0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
bfb0: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
bfc0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
bfd0: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
bfe0: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
bff0: 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  .** The optimiza
c000: 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77  tion is also alw
c010: 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  ays enabled for 
c020: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
c030: 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72   It is.** an err
c040: 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  or to call this 
c050: 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67  function if pPag
c060: 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  er is opened on 
c070: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
c080: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
c090: 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
c0a0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
c0b0: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
c0c0: 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  d. If it can be 
c0d0: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  used,.** then th
c0e0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
c0f0: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
c100: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c110: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74   when it.** cont
c120: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
c130: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
c140: 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64  ne page..*/.#ifd
c150: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c160: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74  _ATOMIC_WRITE.st
c170: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66  atic int jrnlBuf
c180: 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ferSize(Pager *p
c190: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
c1a0: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
c1b0: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
c1c0: 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  ile ){.    int d
c1d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1f0: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
c200: 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e  istics */.    in
c210: 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20  t nSector;      
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a  /* Sector size *
c240: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  /.    int szPage
c250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c260: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
c270: 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  size */..    ass
c280: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
c290: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64  er->fd) );.    d
c2a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
c2b0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c2c0: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
c2d0: 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50      nSector = pP
c2e0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
c2f0: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
c300: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
c310: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ..    assert(SQL
c320: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
c330: 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
c340: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
c350: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
c360: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
c370: 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28      if( 0==(dc&(
c380: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c390: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
c3a0: 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61   || nSector>szPa
c3b0: 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ge) ){.      ret
c3c0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
c3d0: 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e  ..  return JOURN
c3e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
c3f0: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
c400: 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e  Z(pPager);.}.#en
c410: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  dif../*.** If SQ
c420: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c430: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
c440: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
c450: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
c460: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
c470: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
c480: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
c490: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
c4a0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
c4b0: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
c4c0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c4d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
c4e0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
c4f0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
c500: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
c510: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
c520: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
c530: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
c540: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
c550: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
c560: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
c570: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
c580: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
c590: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
c5a0: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
c5b0: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
c5c0: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
c5d0: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
c5e0: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
c5f0: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
c600: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
c610: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
c620: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
c630: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
c640: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
c650: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
c660: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
c670: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
c680: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
c690: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
c6a0: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
c6b0: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
c6c0: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
c6d0: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
c6e0: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
c6f0: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
c700: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
c710: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
c720: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
c730: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
c740: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
c750: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
c760: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
c770: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
c780: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
c790: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
c7a0: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
c7b0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
c7c0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
c7d0: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
c7e0: 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
c7f0: 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
c800: 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
c810: 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
c820: 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73   || pPg->pageHas
c830: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
c840: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
c850: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
c860: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
c870: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
c880: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
c890: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74  define pager_set
c8a0: 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65  _pagehash(X).#de
c8b0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
c8c0: 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51  x).#endif  /* SQ
c8d0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c8e0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20   */../*.** When 
c8f0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
c900: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c910: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
c920: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
c930: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c940: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64  attempts to read
c950: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
c960: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d  l file name from
c970: 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20   the .** end of 
c980: 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66  the file and, if
c990: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70   successful, cop
c9a0: 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  ies it into memo
c9b0: 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ry supplied .** 
c9c0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
c9d0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
c9e0: 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  e writeMasterJou
c9f0: 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66  rnal() for the f
ca00: 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f  ormat.** used to
ca10: 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20   store a master 
ca20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
ca30: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
ca40: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
ca50: 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75  **.** zMaster mu
ca60: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
ca70: 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
ca80: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61   nMaster bytes a
ca90: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
caa0: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20  he caller. This 
cab0: 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65  should be sqlite
cac0: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
cad0: 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68  +1 (to ensure th
cae0: 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68  ere is.** enough
caf0: 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20   space to write 
cb00: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cb10: 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65  al name). If the
cb20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
cb30: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a  ** name in the j
cb40: 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72  ournal is longer
cb50: 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79   than nMaster by
cb60: 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61  tes (including a
cb70: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
cb80: 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69  or), then this i
cb90: 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  s handled as if 
cba0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
cbb0: 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70  l name.** were p
cbc0: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f  resent in the jo
cbd0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
cbe0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cbf0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
cc00: 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  esent at the end
cc10: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
cc20: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  ** file, then it
cc30: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
cc40: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
cc50: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
cc60: 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  . A.** nul-termi
cc70: 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70  nator byte is ap
cc80: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
cc90: 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ffer following t
cca0: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
ccb0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  rnal file name..
ccc0: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64  **.** If it is d
ccd0: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
cce0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
ccf0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
cd00: 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65  esent .** zMaste
cd10: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
cd20: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
cd30: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
cd40: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
cd50: 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  s while reading 
cd60: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
cd70: 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65   file, an SQLite
cd80: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
cd90: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
cda0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
cdb0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
cdc0: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
cdd0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
cde0: 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  u32 nMaster){.  
cdf0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
ce00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ce10: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
ce20: 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
ce30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
ce40: 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20  gth in bytes of 
ce50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
ce60: 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a  ame */.  i64 szJ
ce70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ce80: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
ce90: 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f  e in bytes of jo
cea0: 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c  urnal file pJrnl
ceb0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20   /* MJ checksum 
cee0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
cef0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
cf00: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
cf10: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
cf20: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
cf30: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
cf40: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
cf50: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
cf60: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
cf70: 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74  eader */.  zMast
cf80: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
cf90: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
cfa0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
cfb0: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
cfc0: 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c  szJ)).   || szJ<
cfd0: 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  16.   || SQLITE_
cfe0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
cff0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
d000: 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c  16, &len)).   ||
d010: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20   len>=nMaster . 
d020: 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20    || len==0 .   
d030: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d040: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
d050: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
d060: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
d070: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
d080: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
d090: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
d0a0: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
d0b0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
d0c0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
d0d0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d0e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d0f0: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
d100: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
d110: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
d120: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
d130: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
d140: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
d150: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d160: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
d170: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
d180: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
d190: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
d1a0: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
d1b0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
d1c0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
d1d0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
d1e0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
d1f0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
d200: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
d210: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d220: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
d230: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
d240: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
d250: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
d260: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
d270: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
d280: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
d290: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
d2a0: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
d2b0: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
d2c0: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
d2d0: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
d2e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d2f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d300: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
d310: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
d320: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
d330: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
d340: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
d350: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d360: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
d370: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
d380: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
d390: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
d3a0: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
d3b0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
d3c0: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
d3d0: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
d3e0: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
d3f0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
d400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
d420: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
d430: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
d440: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
d450: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d460: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
d480: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
d4b0: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
d4c0: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
d4d0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
d4e0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
d4f0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
d500: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
d510: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
d520: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
d530: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
d540: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
d550: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
d560: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
d570: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
d580: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
d590: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
d5a0: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
d5b0: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
d5c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d5d0: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
d5e0: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
d5f0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d600: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
d610: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
d620: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d630: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d640: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
d650: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
d660: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
d670: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
d680: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
d690: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
d6a0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
d6b0: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
d6c0: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
d6d0: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
d6e0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
d6f0: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
d700: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
d710: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
d720: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d730: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
d740: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
d750: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
d760: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
d770: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
d780: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
d790: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
d7a0: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
d7b0: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
d7c0: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
d7d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
d7e0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
d7f0: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
d800: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
d810: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
d820: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
d830: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
d840: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
d850: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
d860: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
d870: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
d880: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
d890: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
d8a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
d8b0: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
d8c0: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
d8d0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
d8e0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
d8f0: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
d900: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
d910: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
d920: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
d930: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
d940: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
d950: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
d960: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
d970: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
d980: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
d990: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
d9a0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
d9b0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
d9c0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
d9d0: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
d9e0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
d9f0: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
da00: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
da10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da40: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
da50: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
da60: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
da70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
da80: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
da90: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
daa0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
dab0: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
dac0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
dad0: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
dae0: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
daf0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
db00: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
db10: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
db20: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
db30: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
db40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
db50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
db60: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
db70: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
db80: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
db90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
dba0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
dbb0: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
dbc0: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
dbd0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
dbe0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
dbf0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
dc00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dc10: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
dc20: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
dc30: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
dc40: 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
dc50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
dc60: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72  his point the tr
dc70: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
dc80: 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77  mitted but the w
dc90: 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a  rite lock .    *
dca0: 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  * is still held 
dcb0: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  on the file. If 
dcc0: 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20  there is a size 
dcd0: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
dce0: 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65   for .    ** the
dcf0: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
dd00: 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  nal and the jour
dd10: 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
dd20: 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65  ly consumes more
dd30: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68  .    ** space th
dd40: 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c  an that limit al
dd50: 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61  lows for, trunca
dd60: 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65  te it now. There
dd70: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
dd80: 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66  ** to sync the f
dd90: 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ile following th
dda0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
ddb0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
ddc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
ddd0: 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  imit>0 ){.      
dde0: 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63  i64 sz;.      rc
ddf0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
de00: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
de10: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  , &sz);.      if
de20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
de30: 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a  && sz>iLimit ){.
de40: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
de50: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
de60: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d  Pager->jfd, iLim
de70: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
de80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
de90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
dea0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
deb0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
dec0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
ded0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
dee0: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
def0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
df00: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
df10: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
df20: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
df30: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
df40: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
df50: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
df60: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
df70: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
df80: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
df90: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
dfa0: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
dfb0: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
dfc0: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
dfd0: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
dfe0: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
dff0: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
e000: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
e010: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
e020: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
e030: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
e040: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
e050: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
e060: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
e070: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
e080: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
e090: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74  * - 4 bytes: Dat
e0a0: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
e0b0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
e0c0: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
e0d0: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
e0e0: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
e0f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
e100: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
e110: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
e120: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e130: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e140: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
e150: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
e160: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
e170: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20  >pTmpSpace;  /* 
e180: 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  Temporary space 
e190: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65  used to build he
e1a0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48  ader */.  u32 nH
e1b0: 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61  eader = (u32)pPa
e1c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a  ger->pageSize;/*
e1d0: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
e1e0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48  pointed to by zH
e1f0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
e200: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e220: 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65  * Bytes of heade
e230: 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e  r sector written
e240: 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e270: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
e280: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
e290: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
e2a0: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
e2b0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
e2c0: 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61  . */..  if( nHea
e2d0: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
e2e0: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
e2f0: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
e300: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e310: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
e320: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
e330: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
e340: 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72   any of them wer
e350: 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20  e created .  ** 
e360: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72  since the most r
e370: 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65  ecent journal he
e380: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
e390: 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20  , update the .  
e3a0: 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
e3b0: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
e3c0: 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lds now..  */.  
e3d0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
e3e0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
e3f0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
e400: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
e410: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
e420: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  t==0 ){.      pP
e430: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
e440: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20  [ii].iHdrOffset 
e450: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
e460: 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
e470: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
e480: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
e490: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
e4a0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
e4b0: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  ager);..  /* .  
e4c0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
e4d0: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
e4e0: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
e4f0: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
e500: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
e510: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
e520: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
e530: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
e540: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
e550: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
e560: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
e570: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
e580: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
e590: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
e5a0: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
e5b0: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
e5c0: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
e5d0: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
e5e0: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
e5f0: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
e600: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
e610: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
e620: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
e630: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
e640: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
e650: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
e660: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
e670: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
e680: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
e690: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
e6a0: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
e6b0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
e6c0: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
e6d0: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
e6e0: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
e6f0: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
e700: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
e710: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
e720: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
e730: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
e740: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
e750: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
e760: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
e770: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
e780: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
e790: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
e7a0: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e7b0: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
e7c0: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
e7d0: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
e7e0: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
e7f0: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
e800: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
e810: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e820: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
e830: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
e840: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
e850: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
e860: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
e870: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
e880: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
e890: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
e8a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
e8b0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
e8c0: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
e8d0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
e8e0: 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61  ->noSync || (pPa
e8f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
e900: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
e910: 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c  ODE_MEMORY).   |
e920: 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
e930: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
e940: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
e950: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
e960: 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20  APPEND) .  ){.  
e970: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
e980: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
e990: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
e9a0: 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74  Magic));.    put
e9b0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e9c0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e9d0: 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66  agic)], 0xffffff
e9e0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ff);.  }else{.  
e9f0: 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72    memset(zHeader
ea00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  , 0, sizeof(aJou
ea10: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20  rnalMagic)+4);. 
ea20: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e   }..  /* The ran
ea30: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
ea40: 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20  nitializer */ . 
ea50: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
ea60: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
ea70: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
ea80: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ea90: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
eaa0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eab0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
eac0: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
ead0: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
eae0: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
eaf0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
eb00: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
eb10: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eb20: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
eb30: 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f  dbOrigSize);.  /
eb40: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
eb50: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
eb60: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
eb70: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
eb80: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
eb90: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
eba0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
ebb0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67  );..  /* The pag
ebc0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
ebd0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
ebe0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
ebf0: 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72  gic)+16], pPager
ec00: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
ec10: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20  /* Initializing 
ec20: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
ec30: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65  buffer is not ne
ec40: 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74  cessary.  Everyt
ec50: 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20  hing.  ** works 
ec60: 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c  find if the foll
ec70: 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69  owing memset() i
ec80: 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20  s omitted.  But 
ec90: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a  initializing.  *
eca0: 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65  * the memory pre
ecb0: 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66  vents valgrind f
ecc0: 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c  rom complaining,
ecd0: 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69   so we are willi
ece0: 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20  ng to.  ** take 
ecf0: 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
ed00: 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  hit..  */.  mems
ed10: 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  et(&zHeader[size
ed20: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ed30: 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20  )+20], 0,.      
ed40: 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65     nHeader-(size
ed50: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ed60: 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e  )+20));..  /* In
ed70: 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f   theory, it is o
ed80: 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f  nly necessary to
ed90: 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79   write the 28 by
eda0: 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20  tes that the .  
edb0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
edc0: 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68  r consumes to th
edd0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
ede0: 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d  ere. Then increm
edf0: 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ent the .  ** Pa
ee00: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76  ger.journalOff v
ee10: 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e  ariable by JOURN
ee20: 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61  AL_HDR_SZ so tha
ee30: 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a  t the next .  **
ee40: 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74   record is writt
ee50: 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  en to the follow
ee60: 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76  ing sector (leav
ee70: 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65  ing a gap in the
ee80: 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20   file.  ** that 
ee90: 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74  will be implicit
eea0: 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20  ly filled in by 
eeb0: 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20  the OS)..  **.  
eec0: 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61  ** However it ha
eed0: 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65  s been discovere
eee0: 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73  d that on some s
eef0: 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74  ystems this patt
ef00: 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65  ern can .  ** be
ef10: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73   significantly s
ef20: 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69  lower than conti
ef30: 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20  guously writing 
ef40: 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
ef50: 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  ,.  ** even if t
ef60: 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63  hat means explic
ef70: 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  itly writing dat
ef80: 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f  a to the block o
ef90: 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c  f .  ** (JOURNAL
efa0: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
efb0: 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  tes that will no
efc0: 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68  t be used. So th
efd0: 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20  at is what.  ** 
efe0: 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20  is done. .  **. 
eff0: 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20   ** The loop is 
f000: 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e  required here in
f010: 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72   case the sector
f020: 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
f030: 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64  than the .  ** d
f040: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
f050: 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65  e. Since the zHe
f060: 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f  ader buffer is o
f070: 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69  nly Pager.pageSi
f080: 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e  ze.  ** bytes in
f090: 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e   size, more than
f0a0: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   one call to sql
f0b0: 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61  ite3OsWrite() ma
f0c0: 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20  y be required.  
f0d0: 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ** to populate t
f0e0: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
f0f0: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
f100: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72  .  */ .  for(nWr
f110: 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  ite=0; rc==SQLIT
f120: 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55  E_OK&&nWrite<JOU
f130: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f140: 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65  er); nWrite+=nHe
f150: 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41  ader){.    IOTRA
f160: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
f170: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
f180: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f190: 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20  Hdr, nHeader)). 
f1a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f1b0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
f1c0: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65  fd, zHeader, nHe
f1d0: 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ader, pPager->jo
f1e0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61  urnalOff);.    a
f1f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
f200: 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
f210: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f220: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
f230: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65  ournalOff += nHe
f240: 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ader;.  }..  ret
f250: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f260: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
f270: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
f280: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
f290: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
f2a0: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
f2b0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f2c0: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
f2d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
f2e0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
f2f0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68  rnal.** file. Th
f300: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f310: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f320: 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  l file is given 
f330: 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  by.** pPager->jo
f340: 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f  urnalOff. See co
f350: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
f360: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
f370: 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61  alHdr() for.** a
f380: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
f390: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f3a0: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
f3b0: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
f3c0: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
f3d0: 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73  lly, *pNRec is s
f3e0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
f3f0: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
f400: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
f410: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70  is header and *p
f420: 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  DbSize is set to
f430: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
f440: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
f450: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
f460: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
f470: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
f480: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
f490: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
f4a0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f4b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f4c0: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
f4d0: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
f4e0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
f4f0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
f500: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
f510: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
f520: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
f530: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
f540: 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44  d *pNRec and *PD
f550: 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69  bSize are undefi
f560: 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  ned.  If JOURNAL
f570: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
f580: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
f590: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
f5a0: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
f5b0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
f5c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
f5d0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
f5e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f600: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
f610: 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20  .  int isHot,.  
f620: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f640: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Size of the open
f650: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
f660: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
f670: 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20  *pNRec,         
f680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
f690: 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   Value read from
f6a0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
f6b0: 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  */.  u32 *pDbSiz
f6c0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
f6d0: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
f6e0: 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  of original data
f6f0: 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20  base size field 
f700: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
f730: 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ode */.  unsigne
f740: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
f750: 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65  ;     /* A buffe
f760: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
f770: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
f780: 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f7a0: 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61  Offset of journa
f7b0: 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72  l header being r
f7c0: 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
f7d0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
f7e0: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
f7f0: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
f800: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
f810: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67    /* Advance Pag
f820: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f  er.journalOff to
f830: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
f840: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49  e next sector. I
f850: 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  f the.  ** journ
f860: 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73  al file is too s
f870: 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74  mall for there t
f880: 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74  o be a header st
f890: 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a  ored at this.  *
f8a0: 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20  * point, return 
f8b0: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
f8c0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
f8d0: 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
f8e0: 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
f8f0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
f900: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52  >journalOff+JOUR
f910: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f920: 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65  r) > journalSize
f930: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f940: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
f950: 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
f960: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
f970: 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
f980: 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20  e first 8 bytes 
f990: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
f9a0: 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64  eader. If they d
f9b0: 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a  o not match.  **
f9c0: 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69   the  magic stri
f9d0: 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20  ng found at the 
f9e0: 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f  start of each jo
f9f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65  urnal header, re
fa00: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
fa10: 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20  _DONE. If an IO 
fa20: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
fa30: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
fa40: 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  de. Otherwise,. 
fa50: 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a   ** proceed..  *
fa60: 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c  /.  if( isHot ||
fa70: 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72   iHdrOff!=pPager
fa80: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a  ->journalHdr ){.
fa90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
faa0: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
fab0: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
fac0: 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72  of(aMagic), iHdr
fad0: 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Off);.    if( rc
fae0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
faf0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
fb00: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
fb10: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
fb20: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
fb30: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
fb40: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
fb50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fb60: 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
fb70: 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65  three 32-bit fie
fb80: 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  lds of the journ
fb90: 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e  al header: The n
fba0: 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20  Rec.  ** field, 
fbb0: 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69  the checksum-ini
fbc0: 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65  tializer and the
fbd0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
fbe0: 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  t the start.  **
fbf0: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
fc00: 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ion. Return an e
fc10: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
fc20: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
fc30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
fc40: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
fc50: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
fc60: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c  >jfd, iHdrOff+8,
fc70: 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53   pNRec)).   || S
fc80: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
fc90: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
fca0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
fcb0: 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  12, &pPager->cks
fcc0: 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53  umInit)).   || S
fcd0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
fce0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
fcf0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
fd00: 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20  16, pDbSize)).  
fd10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
fd20: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
fd30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
fd40: 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50  =0 ){.    u32 iP
fd50: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
fd60: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73         /* Page-s
fd70: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
fd80: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
fd90: 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69     u32 iSectorSi
fda0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fdb0: 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66  /* Sector-size f
fdc0: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fdd0: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  header */..    /
fde0: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
fdf0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
fe00: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
fe10: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
fe20: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
fe30: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
fe40: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
fe50: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
fe60: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
fe70: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
fe80: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
fe90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
fea0: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
feb0: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
fec0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
fed0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69   }..    /* Versi
fee0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
fef0: 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74  ior to 3.5.8 set
ff00: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66   the page-size f
ff10: 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20  ield of the.    
ff20: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
ff30: 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68  r to zero. In th
ff40: 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20  is case, assume 
ff50: 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70  that the Pager.p
ff60: 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76  ageSize.    ** v
ff70: 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61  ariable is alrea
ff80: 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  dy set to the co
ff90: 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e  rrect page size.
ffa0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ffb0: 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a  iPageSize==0 ){.
ffc0: 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20        iPageSize 
ffd0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
ffe0: 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ze;.    }..    /
fff0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
10000 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
10010 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  m the page-size 
10020 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
10030 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72  fields.    ** ar
10040 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
10050 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27  To be 'in range'
10060 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65  , both values ne
10070 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
10080 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67  .    ** of two g
10090 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
100a0 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33  qual to 512 or 3
100b0 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74  2, and not great
100c0 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20  er than their . 
100d0 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65     ** respective
100e0 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61   compile time ma
100f0 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20  ximum limits..  
10100 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
10110 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20  geSize<512      
10120 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69              || i
10130 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20  SectorSize<32.  
10140 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e     || iPageSize>
10150 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
10160 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53  SIZE || iSectorS
10170 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ize>MAX_SECTOR_S
10180 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50  IZE.     || ((iP
10190 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65  ageSize-1)&iPage
101a0 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28  Size)!=0   || ((
101b0 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69  iSectorSize-1)&i
101c0 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a  SectorSize)!=0 .
101d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
101e0 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68  If the either th
101f0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73  e page-size or s
10200 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68  ector-size in th
10210 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10220 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e   is .      ** in
10230 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20  valid, then the 
10240 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
10250 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  te the journal-h
10260 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20  eader must have 
10270 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65  .      ** crashe
10280 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61  d before the hea
10290 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20  der was synced. 
102a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f  In this case sto
102b0 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20  p reading .     
102c0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
102d0 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  file here..     
102e0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
102f0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
10300 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61    }..    /* Upda
10310 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  te the page-size
10320 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
10330 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
10340 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  e journal. .    
10350 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73  ** Use a testcas
10360 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b  e() macro to mak
10370 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c  e sure that mall
10380 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69  oc failure withi
10390 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53  n .    ** PagerS
103a0 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20  etPagesize() is 
103b0 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  tested..    */. 
103c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
103d0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
103e0 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69  pPager, &iPageSi
103f0 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  ze, -1);.    tes
10400 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
10410 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
10420 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
10430 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
10440 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
10450 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a  e used by .    *
10460 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
10470 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
10480 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
10490 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
104a0 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
104b0 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
104c0 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
104d0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
104e0 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20      ** is being 
104f0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
10500 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
10510 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
10520 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50  alue.    ** of P
10530 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
10540 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
10550 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
10560 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
10570 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
10580 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
10590 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
105a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
105b0 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
105c0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
105d0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
105e0 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
105f0 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
10600 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
10610 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
10620 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
10630 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
10640 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
10650 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10660 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
10670 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
10680 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
10690 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
106a0 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
106b0 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
106c0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
106d0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
106e0 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
106f0 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
10700 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
10710 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
10720 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
10730 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  **.**   + 4 byte
10740 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
10750 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73  ..**   + N bytes
10760 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
10770 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66   filename in utf
10780 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  -8..**   + 4 byt
10790 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66  es: N (length of
107a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
107b0 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e  name in bytes, n
107c0 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
107d0 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  )..**   + 4 byte
107e0 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
107f0 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
10800 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a  .**   + 8 bytes:
10810 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
10820 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
10830 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
10840 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
10850 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
10860 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
10870 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20  * journal name, 
10880 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20  where each byte 
10890 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
108a0 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74  s a signed 8-bit
108b0 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
108c0 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
108d0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
108e0 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
108f0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
10900 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
10910 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
10920 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
10930 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
10940 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
10950 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
10960 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
10970 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10990 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
109a0 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20  int nMaster;    
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109c0 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
109d0 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
109e0 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a00 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
10a10 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61  header in journa
10a20 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
10a30 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20  jrnlSize;       
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a50 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
10a60 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  file on disk */.
10a70 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f     /* Checksum o
10aa0 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
10ab0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
10ac0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
10ad0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
10ae0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
10af0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
10b00 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  !zMaster .   || 
10b10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
10b20 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
10b30 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
10b40 20 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61    || !isOpen(pPa
10b50 67 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20  ger->jfd).  ){. 
10b60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10b70 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
10b80 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
10b90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
10ba0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
10bb0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
10bc0 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
10bd0 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
10be0 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
10bf0 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
10c00 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
10c10 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
10c20 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
10c30 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
10c40 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
10c50 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
10c60 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
10c70 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
10c80 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
10c90 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
10ca0 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
10cb0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10cc0 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
10cd0 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
10ce0 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
10cf0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
10d00 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
10d10 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
10d20 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
10d30 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
10d40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10d50 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
10d60 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
10d70 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
10d80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10d90 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
10da0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10db0 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
10dc0 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
10dd0 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
10de0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
10df0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
10e00 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
10e10 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
10e20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
10e30 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
10e40 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
10e50 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
10e60 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
10e70 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
10e80 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
10e90 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
10ea0 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
10eb0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
10ec0 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
10ed0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10ee0 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10ef0 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
10f00 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
10f10 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
10f20 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10f30 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
10f40 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
10f50 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
10f60 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
10f70 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
10f80 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b  c, 8, iHdrOff+4+
10f90 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
10fa0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
10fb0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
10fc0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
10fd0 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a  aster+20);..  /*
10fe0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
10ff0 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
11000 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
11010 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
11020 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
11030 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
11040 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11050 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
11060 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
11070 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
11080 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
11090 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
110a0 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
110b0 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
110c0 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
110d0 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
110e0 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
110f0 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
11100 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
11110 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
11120 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
11130 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
11140 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
11150 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
11160 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
11170 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
11180 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
11190 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
111a0 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
111b0 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
111c0 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
111d0 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
111e0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
111f0 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
11200 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
11210 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
11220 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
11230 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
11240 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
11250 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
11260 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
11270 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11280 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65  ** Discard the e
11290 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
112a0 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
112b0 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73  page-cache..*/.s
112c0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
112d0 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
112e0 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  ager){.  pPager-
112f0 3e 6e 52 65 73 65 74 2b 2b 3b 0a 20 20 73 71 6c  >nReset++;.  sql
11300 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
11310 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
11320 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  p);.  sqlite3Pca
11330 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d  cheClear(pPager-
11340 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
11350 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
11360 50 61 67 65 72 2d 3e 6e 52 65 73 65 74 20 76 61  Pager->nReset va
11370 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  lue.*/.u32 sqlit
11380 65 33 50 61 67 65 72 44 61 74 61 56 65 72 73 69  e3PagerDataVersi
11390 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
113a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
113b0 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
113c0 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72 65 74 75  R_OPEN );.  retu
113d0 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  rn pPager->nRese
113e0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  t;.}../*.** Free
113f0 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11400 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11410 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11420 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
11430 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11440 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
11450 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
11460 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11470 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
11480 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
11490 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
114a0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
114b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
114c0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
114d0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
114e0 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
114f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11500 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11510 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11520 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
11530 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11540 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11550 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
11560 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11570 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
11580 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
11590 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
115a0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
115b0 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
115c0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
115d0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
115e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
115f0 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
11600 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
11610 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
11620 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11630 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11640 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11650 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11660 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11670 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
11680 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
11690 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
116a0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
116b0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
116c0 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
116d0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
116e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
116f0 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11700 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
11710 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
11720 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11730 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11740 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11750 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11760 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11770 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11780 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11790 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
117a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
117b0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
117c0 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
117d0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
117e0 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
117f0 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11800 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
11810 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11820 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11830 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11840 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11850 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11860 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11870 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11880 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
11890 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
118a0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
118b0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
118c0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
118d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
118e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
118f0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11900 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  p if the pager i
11910 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
11920 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69  ode and not.** i
11930 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
11940 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
11950 20 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61   switches the pa
11960 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ger to PAGER_OPE
11970 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  N.** state..**.*
11980 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
11990 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
119a0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20  ve-access mode, 
119b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
119c0 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  e is.** complete
119d0 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20  ly unlocked. If 
119e0 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
119f0 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c  cked and the fil
11a00 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a  e-system does.**
11a10 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65   not exhibit the
11a20 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45   UNDELETABLE_WHE
11a30 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c  N_OPEN property,
11a40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11a50 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28  e is.** closed (
11a60 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a  if it is open)..
11a70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
11a80 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73  er is in ERROR s
11a90 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
11aa0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
11ab0 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  d, the .** conte
11ac0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
11ad0 20 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61   cache are disca
11ae0 72 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74  rded before swit
11af0 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a  ching back to .*
11b00 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  * the OPEN state
11b10 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
11b20 77 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65  whether the page
11b30 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11b40 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74  e-mode.** or not
11b50 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69  , any journal fi
11b60 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  le left in the f
11b70 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20  ile-system will 
11b80 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73  be treated.** as
11b90 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
11ba0 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  nd rolled back t
11bb0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72  he next time a r
11bc0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
11bd0 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79  ** is opened (by
11be0 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20   this or by any 
11bf0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11c00 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
11c10 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
11c20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
11c30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11c40 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11c50 52 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c  READER .       |
11c60 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11c70 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20  ==PAGER_OPEN .  
11c80 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
11c90 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
11ca0 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c  ROR .  );..  sql
11cb0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
11cc0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
11cd0 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
11ce0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
11cf0 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
11d00 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
11d10 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
11d20 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
11d30 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11d40 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
11d50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
11d60 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
11d70 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
11d80 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
11d90 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
11da0 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
11db0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
11dc0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
11dd0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
11de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
11df0 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
11e00 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
11e10 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
11e20 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
11e30 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
11e40 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
11e50 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
11e60 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
11e70 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
11e80 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
11e90 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
11ea0 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
11eb0 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
11ec0 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
11ed0 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
11ee0 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
11ef0 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
11f00 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11f10 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
11f20 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
11f30 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
11f40 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
11f50 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
11f60 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11f70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11f80 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
11f90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11fa0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11fb0 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
11fc0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11fd0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11fe0 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
11ff0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12000 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12010 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
12020 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12030 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12040 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
12050 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
12060 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12070 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
12080 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
12090 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
120a0 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
120b0 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
120c0 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
120d0 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
120e0 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
120f0 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
12100 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
12110 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
12120 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
12130 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
12140 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
12150 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
12160 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
12170 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
12180 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
12190 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
121a0 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
121b0 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
121c0 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
121d0 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
121e0 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
121f0 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
12200 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
12210 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
12220 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
12230 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
12240 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
12250 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
12260 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12270 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
12280 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
12290 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
122a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
122b0 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
122c0 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
122d0 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
122e0 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
122f0 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
12300 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
12310 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
12320 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
12330 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
12340 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
12350 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
12360 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
12370 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
12380 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12390 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
123a0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
123b0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
123c0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
123d0 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
123e0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
123f0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12400 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
12410 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
12420 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
12430 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12440 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
12450 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
12460 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
12470 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
12480 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
12490 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
124a0 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
124b0 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
124c0 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
124d0 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
124e0 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
124f0 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
12500 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  de..  */.  if( p
12510 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12520 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
12530 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
12540 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
12550 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
12560 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
12570 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
12580 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12590 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
125a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
125b0 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
125c0 4b 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45  K;.    if( USEFE
125d0 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
125e0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
125f0 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
12600 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
12610 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
12620 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12630 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61  alHdr = 0;.  pPa
12640 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
12650 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
12660 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
12670 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e  lled whenever an
12680 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65   IOERR or FULL e
12690 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72  rror that requir
126a0 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  es.** the pager 
126b0 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e  to transition in
126c0 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
126d0 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75  te may ahve occu
126e0 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72  rred..** The fir
126f0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
12700 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12710 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
12720 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
12730 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
12740 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
12750 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
12760 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  PI function. The
12770 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72   .** value retur
12780 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
12790 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
127a0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
127b0 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
127c0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
127d0 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46  ment is SQLITE_F
127e0 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
127f0 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a  R or one of the.
12800 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64  ** IOERR sub-cod
12810 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e  es, the pager en
12820 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73  ters the ERROR s
12830 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72  tate and the err
12840 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74  or code.** is st
12850 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72  ored in Pager.er
12860 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65  rCode. While the
12870 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69   pager remains i
12880 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
12890 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20  e,.** all major 
128a0 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65  API calls on the
128b0 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
128c0 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50  diately return P
128d0 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a  ager.errCode..**
128e0 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74  .** The ERROR st
128f0 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ate indicates th
12900 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
12910 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12920 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
12930 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
12940 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
12950 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
12960 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
12970 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12980 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
12990 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
129a0 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
129b0 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
129c0 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
129d0 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
129e0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
129f0 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
12a00 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
12a10 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
12a20 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
12a30 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
12a40 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
12a50 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
12a60 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
12a70 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
12a80 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
12a90 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
12aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
12ab0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
12ac0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
12ad0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12ae0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12af0 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
12b00 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12b10 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
12b20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
12b30 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
12b40 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
12b50 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
12b60 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
12b70 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
12b80 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12b90 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61  de = rc;.    pPa
12ba0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12bb0 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  GER_ERROR;.  }. 
12bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
12bd0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12be0 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
12bf0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
12c00 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ge);../*.** This
12c10 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
12c20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
12c30 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
12c40 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
12c50 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
12c60 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
12c70 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
12c80 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
12c90 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
12ca0 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
12cb0 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
12cc0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12cd0 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
12ce0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
12cf0 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
12d00 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
12d10 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
12d20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
12d30 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
12d40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12d50 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
12d60 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  n PAGER_ERROR st
12d70 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61  ate. If it is ca
12d80 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52  lled.** in PAGER
12d90 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53  _NONE or PAGER_S
12da0 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20  HARED state and 
12db0 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73  the lock held is
12dc0 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69   less.** exclusi
12dd0 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56  ve than a RESERV
12de0 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61  ED lock, it is a
12df0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74   no-op..**.** Ot
12e00 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
12e10 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
12e20 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
12e30 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
12e40 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
12e50 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
12e60 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
12e70 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
12e80 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
12e90 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
12ea0 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
12eb0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
12ec0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
12ed0 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
12ee0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
12ef0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
12f00 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
12f10 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
12f20 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
12f30 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
12f40 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
12f50 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
12f60 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
12f70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
12f80 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12f90 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
12fa0 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
12fb0 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
12fc0 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
12fd0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
12fe0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
12ff0 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
13000 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
13010 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
13020 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
13030 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
13040 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
13050 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
13060 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
13070 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
13080 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
13090 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
130a0 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
130b0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
130c0 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
130d0 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
130e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
130f0 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
13100 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
13110 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
13120 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
13130 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
13140 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
13150 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
13160 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
13170 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
13180 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
13190 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
131a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
131b0 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
131c0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
131d0 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
131e0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
131f0 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
13200 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
13210 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
13220 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13230 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
13240 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
13250 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13260 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
13270 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
13280 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
13290 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
132a0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
132b0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
132c0 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
132d0 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
132e0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
132f0 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
13300 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
13310 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
13320 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  is finalized, th
13330 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  e pager moves to
13340 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
13350 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69  ate..** If runni
13360 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
13370 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  ive rollback mod
13380 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  e, the lock on t
13390 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64  he file is .** d
133a0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53  owngraded to a S
133b0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
133c0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
133d0 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
133e0 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
133f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
13400 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
13410 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
13420 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
13430 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
13440 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
13450 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
13460 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
13470 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
13480 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
13490 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
134a0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
134b0 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
134c0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
134d0 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
134e0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
134f0 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
13500 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
13510 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
13520 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13530 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
13540 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
13550 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
13560 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
13570 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
13580 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
13590 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
135a0 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
135b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
135c0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
135d0 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
135e0 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
135f0 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  er, int bCommit)
13600 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13610 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
13620 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
13630 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
13640 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
13650 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
13660 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
13670 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
13680 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
13690 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  peration */..  /
136a0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
136b0 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
136c0 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  ot have an open 
136d0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
136e0 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61  n.  ** or at lea
136f0 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
13700 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ck. This functio
13710 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
13720 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20  when there.  ** 
13730 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
13740 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62  saction active b
13750 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ut a RESERVED or
13760 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
13770 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72  .  ** held under
13780 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
13790 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  es:.  **.  **   
137a0 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65  1. After a succe
137b0 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61  ssful hot-journa
137c0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
137d0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20  s called with.  
137e0 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d  **      eState==
137f0 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65  PAGER_NONE and e
13800 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13810 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  LOCK..  **.  ** 
13820 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63    2. If a connec
13830 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e  tion with lockin
13840 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
13850 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
13860 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20  USIVE .  **     
13870 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62   lock switches b
13880 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d  ack to locking_m
13890 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74  ode=normal and t
138a0 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20  hen executes a. 
138b0 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72   **      read-tr
138c0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
138d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
138e0 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d  ed with eState==
138f0 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
13900 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63  **      and eLoc
13910 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
13920 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d  K when the read-
13930 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
13940 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  losed..  */.  as
13950 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
13960 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
13970 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
13980 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
13990 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  GER_ERROR );.  i
139a0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
139b0 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e<PAGER_WRITER_L
139c0 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d  OCKED && pPager-
139d0 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f  >eLock<RESERVED_
139e0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
139f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13a00 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  }..  releaseAllS
13a10 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
13a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
13a30 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
13a40 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a   || pPager->pInJ
13a50 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69  ournal==0 );.  i
13a60 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
13a70 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73  ->jfd) ){.    as
13a80 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
13a90 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
13aa0 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74     /* Finalize t
13ab0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13ac0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
13ad0 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
13ae0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
13af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13b00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13b10 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13b20 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
13b30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
13b40 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
13b50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13b60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13b70 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13b80 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
13b90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
13ba0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
13bb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
13bc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13bd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13be0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13bf0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
13c00 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
13c10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13c20 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
13c30 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
13c40 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
13c50 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  re the new file 
13c60 73 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20  size is written 
13c70 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72  into the inode r
13c80 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20  ight away..     
13c90 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
13ca0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  e the journal mi
13cb0 67 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f  ght resurrect fo
13cc0 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20  llowing a power 
13cd0 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20  loss and.       
13ce0 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20     ** cause the 
13cf0 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  last transaction
13d00 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20   to roll back.  
13d10 53 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  See.          **
13d20 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
13d30 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68  a.mozilla.org/sh
13d40 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30  ow_bug.cgi?id=10
13d50 37 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20  72773.          
13d60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
13d70 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
13d80 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
13d90 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
13da0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13db0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
13dc0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
13dd0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13de0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13df0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13e00 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
13e10 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
13e20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
13e30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13e40 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
13e50 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
13e60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
13e70 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
13e80 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
13e90 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
13ea0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13eb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ec0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
13ed0 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20  may be executed 
13ee0 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e  with Pager.journ
13ef0 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69  alMode==MEMORY i
13f00 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74  f.      ** a hot
13f10 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73  -journal was jus
13f20 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  t rolled back. I
13f30 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
13f40 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
13f50 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
13f60 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
13f70 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e  ed. If this conn
13f80 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f  ection writes to
13f90 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
13fa0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20  tabase file, it 
13fb0 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67  will do so using
13fc0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
13fd0 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f  urnal. .      */
13fe0 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65  .      int bDele
13ff0 74 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74  te = (!pPager->t
14000 65 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74  empFile && sqlit
14010 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28  e3JournalExists(
14020 70 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20  pPager->jfd));. 
14030 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14040 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14050 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14060 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20  ODE_DELETE .    
14070 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
14080 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14090 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
140a0 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20  _MEMORY .       
140b0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
140c0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
140d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
140e0 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
140f0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
14100 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
14110 20 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65       if( bDelete
14120 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14130 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
14140 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
14150 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
14160 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
14170 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
14180 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
14190 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  S.  sqlite3Pcach
141a0 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
141b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
141c0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
141d0 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
141e0 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73  ->dbSize==0 && s
141f0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
14200 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
14210 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50  ache)>0 ){.    P
14220 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  gHdr *p = sqlite
14230 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
14240 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ger, 1);.    if(
14250 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70   p ){.      p->p
14260 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20  ageHash = 0;.   
14270 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
14280 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a  nrefNotNull(p);.
14290 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
142a0 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
142b0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
142c0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
142d0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
142e0 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  al = 0;.  pPager
142f0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71  ->nRec = 0;.  sq
14300 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
14310 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
14320 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  che);.  sqlite3P
14330 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50  cacheTruncate(pP
14340 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
14350 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
14360 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
14370 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
14380 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41    /* Drop the WA
14390 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66  L write-lock, if
143a0 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74   any. Also, if t
143b0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  he connection wa
143c0 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  s in .    ** loc
143d0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
143e0 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20  ive mode but is 
143f0 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20  no longer, drop 
14400 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20  the EXCLUSIVE . 
14410 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20     ** lock held 
14420 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14430 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
14440 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61   rc2 = sqlite3Wa
14450 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63  lEndWriteTransac
14460 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
14470 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
14480 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
14490 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
144a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
144b0 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72  Commit && pPager
144c0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61  ->dbFileSize>pPa
144d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
144e0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
144f0 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
14500 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
14510 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c  nsaction in roll
14520 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  back-journal.   
14530 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20   ** mode if the 
14540 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
14550 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20   disk is larger 
14560 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
14570 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20  e image..    ** 
14580 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
14590 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
145a0 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64  en finalized and
145b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
145c0 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73   .    ** success
145d0 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c  fully committed,
145e0 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49   but the EXCLUSI
145f0 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c  VE lock is still
14600 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20   held on the.   
14610 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20   ** file. So it 
14620 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63  is safe to trunc
14630 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
14640 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e   file to its min
14650 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75  imum.    ** requ
14660 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  ired size.  */. 
14670 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
14680 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
14690 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
146a0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
146b0 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
146c0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
146d0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
146e0 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74  TE_OK && bCommit
146f0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
14700 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63  r->fd) ){.    rc
14710 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
14720 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
14730 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
14740 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f  _COMMIT_PHASETWO
14750 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
14760 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
14770 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  D ) rc = SQLITE_
14780 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
14790 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
147a0 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70  eMode .   && (!p
147b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
147c0 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c  r) || sqlite3Wal
147d0 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
147e0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a  ager->pWal, 0)).
147f0 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70    ){.    rc2 = p
14800 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
14810 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
14820 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
14830 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
14840 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
14850 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
14860 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65  _READER;.  pPage
14870 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
14880 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
14890 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
148a0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  c);.}../*.** Exe
148b0 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
148c0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
148d0 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
148e0 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
148f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
14900 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
14910 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
14920 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
14930 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74  tate, do not att
14940 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c  empt .** the rol
14950 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69  lback at this ti
14960 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67  me. Instead, pag
14970 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63  er_unlock() is c
14980 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61  alled. The.** ca
14990 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
149a0 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72  ck() will discar
149b0 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
149c0 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a  pages, unlock.**
149d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
149e0 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  le and move the 
149f0 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50  pager back to OP
14a00 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  EN state. If thi
14a10 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  s .** means that
14a20 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d   there is a hot-
14a30 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20  journal left in 
14a40 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
14a50 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f   the next .** co
14a60 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  nnection to obta
14a70 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
14a80 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77   on the pager (w
14a90 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73  hich may be this
14aa0 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72   one) .** will r
14ab0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
14ac0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14ad0 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
14ae0 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
14af0 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20  R state, but an 
14b00 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20  IO or.** malloc 
14b10 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
14b20 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
14b30 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69  then this will i
14b40 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20  tself cause .** 
14b50 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
14b60 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  er the ERROR sta
14b70 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62  te. Which will b
14b80 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65  e cleared by the
14b90 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
14ba0 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64  r_unlock(), as d
14bb0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a  escribed above..
14bc0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
14bd0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
14be0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
14bf0 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
14c00 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
14c10 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65  R_ERROR && pPage
14c20 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14c30 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73  _OPEN ){.    ass
14c40 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
14c50 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
14c60 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
14c70 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
14c80 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
14c90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
14ca0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
14cb0 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
14cc0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
14cd0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
14ce0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
14cf0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73  lloc();.    }els
14d00 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
14d10 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
14d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14d30 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
14d40 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
14d50 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72      pager_end_tr
14d60 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
14d70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
14d80 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
14d90 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
14da0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
14db0 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
14dc0 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
14dd0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
14de0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
14df0 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
14e00 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
14e10 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
14e20 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
14e30 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
14e40 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
14e50 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
14e60 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
14e70 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
14e80 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
14e90 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
14ea0 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
14eb0 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
14ec0 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
14ed0 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
14ee0 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
14ef0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
14f00 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
14f10 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
14f20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14f30 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
14f40 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
14f50 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
14f60 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
14f70 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
14f80 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
14f90 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
14fa0 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
14fb0 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
14fc0 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
14fd0 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
14fe0 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
14ff0 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
15000 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
15010 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
15020 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
15030 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
15040 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
15050 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
15060 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
15070 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
15080 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
15090 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
150a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
150b0 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
150c0 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
150d0 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
150e0 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
150f0 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
15100 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
15110 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
15120 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
15130 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
15140 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
15150 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
15160 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
15170 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
15180 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
15190 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
151a0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
151b0 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
151c0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
151d0 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
151e0 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
151f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
15200 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
15210 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
15220 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
15230 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
15240 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
15250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
15260 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
15270 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
15280 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
15290 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
152a0 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
152b0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
152c0 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
152d0 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
152e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
152f0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
15300 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
15310 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
15320 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
15330 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
15340 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15360 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
15370 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
15380 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
15390 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
153a0 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
153b0 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
153c0 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
153d0 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  dec */.#endif../
153e0 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
153f0 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74  le page from eit
15400 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
15410 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a  file (if isMainJ
15420 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72  rnl==1) or.** fr
15430 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
15440 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  al (if isMainJrn
15450 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61  l==0) and playba
15460 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a  ck that page..**
15470 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73   The page begins
15480 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66   at offset *pOff
15490 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
154a0 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a  e. The *pOffset.
154b0 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ** value is incr
154c0 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61  eased to the sta
154d0 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  rt of the next p
154e0 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
154f0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  al..**.** The ma
15500 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
15510 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75  nal uses checksu
15520 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
15530 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
15540 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  .** not..**.** I
15550 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
15560 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
15570 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
15580 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
15590 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
155a0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
155b0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
155c0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
155d0 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
155e0 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
155f0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
15600 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
15610 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
15620 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
15630 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
15640 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
15650 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
15660 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
15670 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
15680 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
15690 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
156a0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
156b0 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
156c0 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
156d0 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
156e0 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
156f0 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
15700 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
15710 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
15720 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
15730 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
15740 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
15750 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
15760 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
15770 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
15780 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
15790 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
157a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
157b0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
157c0 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
157d0 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
157e0 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
157f0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
15800 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
15810 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
15820 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
15830 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
15840 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
15850 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
15860 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
15870 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
15880 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
15890 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
158a0 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
158b0 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
158c0 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
158d0 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
158e0 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
158f0 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
15900 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
15910 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
15920 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
15930 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
15940 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
15950 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
15960 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
15970 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15980 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
15990 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
159a0 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
159b0 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
159c0 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
159d0 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
159e0 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
159f0 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
15a00 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15a10 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
15a20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
15a30 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
15a40 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
15a50 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
15a60 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
15a70 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
15a80 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
15a90 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
15aa0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
15ab0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
15ac0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
15ad0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15ae0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
15af0 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
15b00 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
15b10 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
15b20 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
15b30 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  ack */.  i64 *pO
15b40 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
15b50 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
15b60 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
15b70 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  ayback */.  Bitv
15b80 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20  ec *pDone,      
15b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
15ba0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
15bb0 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
15bc0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
15bd0 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
15be0 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
15bf0 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
15c00 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
15c10 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20   int isSavepnt  
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15c30 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76  * True for a sav
15c40 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15c50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
15c60 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
15c90 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
15ca0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cc0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
15cd0 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
15ce0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
15cf0 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15d10 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
15d20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
15d30 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ing */.  char *a
15d40 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
15d50 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
15d60 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
15d70 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
15d80 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
15d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15da0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
15db0 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
15dc0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
15dd0 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20   isSynced;      
15de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15df0 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61  ue if journal pa
15e00 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  ge is synced */.
15e10 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
15e20 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
15e30 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
15e40 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
15e50 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
15e60 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
15e70 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
15e80 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
15e90 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
15ea0 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
15eb0 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
15ec0 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
15ed0 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
15ee0 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
15ef0 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
15f00 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
15f10 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
15f20 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
15f30 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  ta = pPager->pTm
15f40 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
15f50 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
15f60 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
15f70 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
15f80 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
15f90 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ted */.  assert(
15fa0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
15fb0 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d  ger)==0 || (!isM
15fc0 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76  ainJrnl && isSav
15fd0 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  epnt) );..  /* E
15fe0 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20  ither the state 
15ff0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
16000 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
16010 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63  HEMOD (a transac
16020 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61  tion .  ** or sa
16030 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
16040 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71   done at the req
16050 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  uest of the call
16060 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20  er) or this is. 
16070 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
16080 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69  l rollback. If i
16090 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t is a hot-journ
160a0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  al rollback, the
160b0 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69   pager.  ** is i
160c0 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64  n state OPEN and
160d0 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53   holds an EXCLUS
160e0 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f  IVE lock. Hot-jo
160f0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20  urnal rollback. 
16100 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66   ** only reads f
16110 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
16120 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75  rnal, not the su
16130 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  b-journal..  */.
16140 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16150 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
16160 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
16170 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
16180 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
16190 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d  _OPEN && pPager-
161a0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
161b0 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61  E_LOCK).  );.  a
161c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
161d0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
161e0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20  TER_CACHEMOD || 
161f0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20  isMainJrnl );.. 
16200 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
16210 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
16220 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
16230 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
16240 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
16250 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
16260 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
16270 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
16280 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
16290 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
162a0 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
162b0 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
162c0 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
162d0 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
162e0 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
162f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
16310 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
16320 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  (jfd, (u8*)aData
16330 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16340 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34  ze, (*pOffset)+4
16350 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16360 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
16370 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b  rc;.  *pOffset +
16380 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
16390 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a  ze + 4 + isMainJ
163a0 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  rnl*4;..  /* San
163b0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
163c0 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
163d0 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
163e0 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
163f0 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
16400 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
16410 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
16420 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
16430 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
16440 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
16450 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
16460 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
16470 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
16480 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
16490 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
164a0 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
164b0 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
164c0 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
164d0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
164e0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
164f0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
16500 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
16510 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29  rt( !isSavepnt )
16520 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16530 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
16540 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70  if( pgno>(Pgno)p
16550 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
16560 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
16570 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20  st(pDone, pgno) 
16580 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
16590 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
165a0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
165b0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
165c0 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66  bits(jfd, (*pOff
165d0 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b  set)-4, &cksum);
165e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
165f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
16600 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
16610 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
16620 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d  r, (u8*)aData)!=
16630 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
16640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
16650 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
16660 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
16670 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
16680 20 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72   played by befor
16690 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  e during the cur
166a0 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  rent.  ** rollba
166b0 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62  ck, then don't b
166c0 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74  other to play it
166d0 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a   back again..  *
166e0 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  /.  if( pDone &&
166f0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
16700 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
16710 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
16720 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
16730 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  c;.  }..  /* Whe
16740 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70  n playing back p
16750 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74  age 1, restore t
16760 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74  he nReserve sett
16770 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
16780 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72  gno==1 && pPager
16790 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38  ->nReserve!=((u8
167a0 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a  *)aData)[20] ){.
167b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
167c0 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61  erve = ((u8*)aDa
167d0 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67  ta)[20];.    pag
167e0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
167f0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
16800 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
16810 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74  in CACHEMOD stat
16820 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
16830 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
16840 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
16850 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
16860 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
16870 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
16880 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
16890 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
168a0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
168b0 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
168c0 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
168d0 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
168e0 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
168f0 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
16900 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
16910 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
16920 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
16930 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
16940 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
16950 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
16960 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
16970 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
16980 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
16990 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
169a0 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
169b0 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
169c0 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
169d0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
169e0 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
169f0 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
16a00 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
16a10 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
16a20 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
16a30 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
16a40 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
16a50 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
16a60 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52  WRITER_DBMOD, WR
16a70 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72  ITER_FINISHED or
16a80 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65   OPEN state, the
16a90 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a  n we update the.
16aa0 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65    ** pager cache
16ab0 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e   if it exists an
16ac0 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
16ad0 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
16ae0 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e  n marked .  ** n
16af0 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20  ot dirty. Since 
16b00 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c  this code is onl
16b10 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41  y executed in PA
16b20 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66  GER_OPEN state f
16b30 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  or.  ** a hot-jo
16b40 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
16b50 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
16b60 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63   that the page-c
16b70 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20  ache is empty.  
16b80 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
16b90 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65  is in OPEN state
16ba0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
16bb0 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
16bc0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
16bd0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
16be0 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
16bf0 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
16c00 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
16c10 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
16c20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
16c30 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
16c40 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
16c50 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
16c60 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
16c70 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
16c80 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
16c90 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
16ca0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
16cb0 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
16cc0 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
16cd0 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
16ce0 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
16cf0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
16d00 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
16d10 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
16d20 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
16d30 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
16d40 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
16d50 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
16d60 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
16d70 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
16d80 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
16d90 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
16da0 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
16db0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
16dc0 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
16dd0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
16de0 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
16df0 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
16e00 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
16e10 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
16e20 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
16e30 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
16e40 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
16e50 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16e60 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
16e70 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
16e80 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
16e90 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
16ea0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
16eb0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
16ec0 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
16ed0 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
16ee0 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
16ef0 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
16f00 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
16f10 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
16f20 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
16f30 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
16f40 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
16f50 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
16f60 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
16f70 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
16f80 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
16f90 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
16fa0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
16fb0 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
16fc0 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
16fd0 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
16fe0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
16ff0 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
17000 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
17010 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
17020 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
17030 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
17040 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
17050 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
17060 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
17070 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  ager, pgno);.  }
17080 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
17090 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
170a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
170b0 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
170c0 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20   || pPg==0 );.  
170d0 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
170e0 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
170f0 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
17100 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41  ",.           PA
17110 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
17120 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
17130 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
17140 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61  Size, (u8*)aData
17150 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69  ),.           (i
17160 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
17170 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
17180 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
17190 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
171a0 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
171b0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
171c0 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20  || (*pOffset <= 
171d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
171e0 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
171f0 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50    isSynced = (pP
17200 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
17210 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
17220 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a  EED_SYNC));.  }.
17230 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
17240 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28  ger->fd).   && (
17250 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
17260 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
17270 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
17280 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
17290 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64  ).   && isSynced
172a0 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
172b0 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
172c0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
172d0 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ize;.    testcas
172e0 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  e( !isSavepnt &&
172f0 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d   pPg!=0 && (pPg-
17300 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
17310 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20  D_SYNC)!=0 );.  
17320 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
17330 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
17340 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
17350 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
17360 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74  ->fd, (u8 *)aDat
17370 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17380 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  ize, ofst);.    
17390 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
173a0 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
173b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
173c0 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
173d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
173e0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
173f0 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50  .      CODEC1(pP
17400 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
17410 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
17420 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71  NOMEM);.      sq
17430 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
17440 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
17450 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44  p, pgno, (u8*)aD
17460 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  ata);.      CODE
17470 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C2(pPager, aData
17480 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51  , pgno, 7, rc=SQ
17490 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74  LITE_NOMEM, aDat
174a0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  a);.    }.  }els
174b0 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e  e if( !isMainJrn
174c0 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20  l && pPg==0 ){. 
174d0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
174e0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61   a rollback of a
174f0 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64   savepoint and d
17500 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74  ata was not writ
17510 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ten to.    ** th
17520 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
17530 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
17540 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20  n-memory, there 
17550 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20  is a potential. 
17560 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57     ** problem. W
17570 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
17580 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20  next fetched by 
17590 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
175a0 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  , it .    ** wil
175b0 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
175c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
175d0 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
175e0 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a  ay not be .    *
175f0 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20  * current. .    
17600 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  **.    ** There 
17610 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  are a couple of 
17620 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74  different ways t
17630 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20  his can happen. 
17640 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20  All are quite.  
17650 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68    ** obscure. Wh
17660 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79  en running in sy
17670 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
17680 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  this can only ha
17690 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20  ppen .    ** if 
176a0 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74  the page is on t
176b0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20  he free-list at 
176c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
176d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
176e0 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  en.    ** popula
176f0 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20  ted, then moved 
17700 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
17710 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20  erMovepage()..  
17720 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
17730 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61  solution is to a
17740 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  dd an in-memory 
17750 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68  page to the cach
17760 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  e containing.   
17770 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73   ** the data jus
17780 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  t read from the 
17790 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72  sub-journal. Mar
177a0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
177b0 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20  rty .    ** and 
177c0 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71  if the pager req
177d0 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d  uires a journal-
177e0 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20  sync, then mark 
177f0 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20  the page as .   
17800 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20   ** requiring a 
17810 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66  journal-sync bef
17820 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65  ore it is writte
17830 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
17840 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
17850 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
17860 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
17870 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
17880 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20  OLLBACK)==0 );. 
17890 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
178a0 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
178b0 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  AG_ROLLBACK;.   
178c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
178d0 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
178e0 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29  , pgno, &pPg, 1)
178f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
17900 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
17910 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
17920 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20  LLBACK)!=0 );.  
17930 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
17940 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c  pill &= ~SPILLFL
17950 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  AG_ROLLBACK;.   
17960 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17970 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17980 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26      pPg->flags &
17990 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45  = ~PGHDR_NEED_RE
179a0 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  AD;.    sqlite3P
179b0 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
179c0 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Pg);.  }.  if( p
179d0 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
179e0 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
179f0 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
17a00 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
17a10 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
17a20 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
17a30 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
17a40 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
17a50 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
17a60 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
17a70 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
17a80 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
17a90 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
17aa0 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
17ab0 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
17ac0 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
17ad0 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
17ae0 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
17af0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
17b00 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
17b10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
17b20 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44  d *pData;.    pD
17b30 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
17b40 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
17b50 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  ta, (u8*)aData, 
17b60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17b70 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  );.    pPager->x
17b80 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20  Reiniter(pPg);. 
17b90 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e     if( isMainJrn
17ba0 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74  l && (!isSavepnt
17bb0 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50   || *pOffset<=pP
17bc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17bd0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
17be0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
17bf0 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20   this page were 
17c00 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72  just restored fr
17c10 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20  om the main .   
17c20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
17c30 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e  le, then its con
17c40 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20  tent must be as 
17c50 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74  they were when t
17c60 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  he .      ** tra
17c70 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72  nsaction was fir
17c80 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68  st opened. In th
17c90 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d  is case we can m
17ca0 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20  ark the page.   
17cb0 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20     ** as clean, 
17cc0 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c  since there will
17cd0 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77   be no need to w
17ce0 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
17cf0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
17d00 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  base..      **. 
17d10 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
17d20 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74   one exception t
17d30 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20  o this rule. If 
17d40 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
17d50 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a  g rolled.      *
17d60 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f  * back as part o
17d70 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f  f a savepoint (o
17d80 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c  r statement) rol
17d90 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20  lback from an . 
17da0 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64       ** unsynced
17db0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
17dc0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
17dd0 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  e, then it is no
17de0 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20  t safe.      ** 
17df0 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  to mark the page
17e00 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20   as clean. This 
17e10 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69  is because marki
17e20 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20  ng the page as. 
17e30 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69       ** clean wi
17e40 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  ll clear the PGH
17e50 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
17e60 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  g. Since the pag
17e70 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c  e is.      ** al
17e80 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
17e90 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72  rnal file (recor
17ea0 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  ded in Pager.pIn
17eb0 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20  Journal) and.   
17ec0 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
17ed0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
17ee0 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68  s cleared, if th
17ef0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
17f00 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67  n to.      ** ag
17f10 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
17f20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
17f30 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61  will be marked a
17f40 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20  s dirty but.    
17f50 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
17f60 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69  EED_SYNC flag wi
17f70 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49  ll not be set. I
17f80 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74  t could then pot
17f90 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a  entially.      *
17fa0 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  * be written out
17fb0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
17fc0 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69  se file before i
17fd0 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ts journal file.
17fe0 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
17ff0 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61   is synced. If a
18000 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75   crash occurs du
18010 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e  ring or followin
18020 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a  g this,.      **
18030 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
18040 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a  tion may ensue..
18050 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
18060 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
18070 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
18080 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
18090 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
180a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
180b0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
180c0 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  Pg);..    /* If 
180d0 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c  this was page 1,
180e0 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
180f0 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
18100 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20  .dbFileVers..   
18110 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f   ** Do this befo
18120 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e  re any decoding.
18130 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
18140 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==1 ){.      mem
18150 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
18160 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
18170 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f  pData)[24],sizeo
18180 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
18190 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  Vers));.    }.. 
181a0 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65     /* Decode the
181b0 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20   page just read 
181c0 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20  from disk */.   
181d0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
181e0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
181f0 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
18200 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74  OMEM);.    sqlit
18210 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
18220 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
18230 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18240 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
18250 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
18260 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
18270 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
18280 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
18290 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
182a0 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
182b0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
182c0 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
182d0 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
182e0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
182f0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
18300 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
18310 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
18320 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
18330 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
18340 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72  Argument zMaster
18350 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61   may point to Pa
18360 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53  ger.pTmpSpace. S
18370 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73  o that buffer is
18380 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62   not .** availab
18390 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69  le for use withi
183a0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  n this function.
183b0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61  .**.** When a ma
183c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
183d0 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74  e is created, it
183e0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
183f0 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a  th the names .**
18400 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63   of all of its c
18410 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f  hild journals, o
18420 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72  ne after another
18430 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75  , formatted as u
18440 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64  tf-8 .** encoded
18450 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f   text. The end o
18460 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  f each child jou
18470 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72  rnal file is mar
18480 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e  ked with a .** n
18490 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
184a0 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20  te (0x00). i.e. 
184b0 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
184c0 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20  nts of a master 
184d0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
184e0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
184f0 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20  n involving two 
18500 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20  databases might 
18510 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f  be:.**.**   "/ho
18520 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75  me/bill/a.db-jou
18530 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69  rnal\x00/home/bi
18540 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/b.db-journal\
18550 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73  x00".**.** A mas
18560 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18570 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c   may only be del
18580 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66  eted once all of
18590 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a   its child .** j
185a0 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65  ournals have bee
185b0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
185c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
185d0 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e  on reads the con
185e0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
185f0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
18600 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79   into .** memory
18610 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75   and loops throu
18620 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  gh each of the c
18630 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  hild journal nam
18640 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  es. For.** each 
18650 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69  child journal, i
18660 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a  t checks if:.**.
18670 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
18680 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ild journal exis
18690 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a  ts, and if so.**
186a0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
186b0 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  d journal contai
186c0 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ns a reference t
186d0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
186e0 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d   .**     file zM
186f0 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61  aster.**.** If a
18700 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
18710 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74  an be found that
18720 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66   matches both of
18730 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a   the criteria.**
18740 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e   above, this fun
18750 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
18760 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
18770 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  hing. Otherwise,
18780 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63   if.** no such c
18790 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
187a0 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20   be found, file 
187b0 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74  zMaster is delet
187c0 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66  ed from.** the f
187d0 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67  ile-system using
187e0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
187f0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
18800 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20  IO error within 
18810 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
18820 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
18830 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
18840 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
18850 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63  ates memory by c
18860 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61  alling sqlite3Ma
18870 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c  lloc(). If an al
18880 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c  location.** fail
18890 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
188a0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
188b0 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f  erwise, if no IO
188c0 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   or malloc error
188d0 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c  s .** occur, SQL
188e0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
188f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
18900 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
18910 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65  locates a single
18920 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
18930 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20   to load.** the 
18940 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
18950 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
18960 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
18970 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63   could be.** a c
18980 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74  ouple of kilobyt
18990 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e  es or so - poten
189a0 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68  tially larger th
189b0 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  an the page .** 
189c0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
189d0 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
189e0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
189f0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
18a00 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  Master){.  sqlit
18a10 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
18a20 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
18a30 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
18a40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
18a50 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
18a60 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
18a70 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  er;    /* Malloc
18a80 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  'd master-journa
18a90 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
18aa0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
18ab0 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20  ile *pJournal;  
18ac0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69   /* Malloc'd chi
18ad0 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld-journal file 
18ae0 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
18af0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
18b00 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
18b10 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
18b20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18b30 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
18b40 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
18b50 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
18b60 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18b70 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
18b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
18b90 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72  nter to one jour
18ba0 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69  nal within MJ fi
18bb0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  le */.  char *zM
18bc0 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
18bd0 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f    /* Space to ho
18be0 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66  ld MJ filename f
18bf0 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  rom a journal fi
18c00 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  le */.  int nMas
18c10 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18c20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73    /* Amount of s
18c30 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74  pace allocated t
18c40 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a  o zMasterPtr[] *
18c50 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
18c60 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20   space for both 
18c70 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64  the pJournal and
18c80 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65   pMaster file de
18c90 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20  scriptors..  ** 
18ca0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
18cb0 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
18cc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
18cd0 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  reading..  */.  
18ce0 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
18cf0 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
18d00 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73  3MallocZero(pVfs
18d10 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
18d20 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
18d30 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
18d40 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
18d50 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
18d60 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
18d70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
18d80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
18d90 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  se{.    const in
18da0 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
18db0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
18dc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
18dd0 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
18de0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
18df0 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
18e00 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
18e10 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
18e20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18e30 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18e40 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  out;..  /* Load 
18e50 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
18e60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
18e70 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
18e80 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c  ed from.  ** sql
18e90 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
18ea0 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
18eb0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
18ec0 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20    Also obtain.  
18ed0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ** sufficient sp
18ee0 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50  ace (in zMasterP
18ef0 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  tr) to hold the 
18f00 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a  names of master.
18f10 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
18f20 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
18f30 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61  m regular rollba
18f40 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ck-journals..  *
18f50 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
18f60 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
18f70 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
18f80 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
18f90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
18fa0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18fb0 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70    nMasterPtr = p
18fc0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
18fd0 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  1;.  zMasterJour
18fe0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
18ff0 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
19000 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20  al + nMasterPtr 
19010 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61  + 1);.  if( !zMa
19020 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
19030 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19040 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64  OMEM;.    goto d
19050 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19060 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d  }.  zMasterPtr =
19070 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &zMasterJournal
19080 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b  [nMasterJournal+
19090 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  1];.  rc = sqlit
190a0 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
190b0 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
190c0 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  , (int)nMasterJo
190d0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28  urnal, 0);.  if(
190e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
190f0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19100 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  out;.  zMasterJo
19110 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
19120 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a  rnal] = 0;..  zJ
19130 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
19140 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65  Journal;.  while
19150 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
19160 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
19170 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
19180 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20    int exists;.  
19190 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
191a0 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f  Access(pVfs, zJo
191b0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
191c0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
191d0 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72  ists);.    if( r
191e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
191f0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
19200 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
19210 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
19220 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  {.      /* One o
19230 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
19240 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
19250 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19260 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a  exists..      **
19270 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
19280 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
19290 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
192a0 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
192b0 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
192c0 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
192d0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
192e0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  l file..      */
192f0 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  .      int c;.  
19300 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
19310 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
19320 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
19330 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
19340 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
19350 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
19360 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
19370 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
19380 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
193a0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
193b0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
193c0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
193d0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
193e0 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
193f0 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
19400 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
19410 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
19420 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19430 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19440 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
19450 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
19460 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
19470 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72  Ptr[0]!=0 && str
19480 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
19490 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
194a0 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
194b0 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
194c0 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
194d0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
194e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
194f0 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  /.        goto d
19500 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19510 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19520 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c  zJournal += (sql
19530 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f  ite3Strlen30(zJo
19540 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20  urnal)+1);.  }. 
19550 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
19560 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63  e(pMaster);.  rc
19570 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
19580 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
19590 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  , 0);..delmaster
195a0 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f  _out:.  sqlite3_
195b0 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  free(zMasterJour
195c0 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73  nal);.  if( pMas
195d0 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
195e0 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
195f0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
19600 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c  !isOpen(pJournal
19610 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
19620 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
19630 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19640 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
19650 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
19660 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61   to change the a
19670 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
19680 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
19690 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
196a0 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c  system. This onl
196b0 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
196c0 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
196d0 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72  saction,.** or r
196e0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
196f0 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75  ansaction (inclu
19700 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63  ding rolling bac
19710 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  k a hot-journal)
19720 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ..**.** If the m
19730 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
19740 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
19750 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  r the pager is n
19760 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  ot in either.** 
19770 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74  DBMOD or OPEN st
19780 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
19790 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
197a0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69  therwise, the si
197b0 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  ze .** of the fi
197c0 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  le is changed to
197d0 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
197e0 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
197f0 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a  Size bytes). .**
19800 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   If the file on 
19810 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
19820 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
19830 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
19840 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
19850 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
19860 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
19870 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
19880 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
19890 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
198a0 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
198b0 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65  r than .** nPage
198c0 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65   pages. Some ope
198d0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
198e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
198f0 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
19900 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f  f .** you try to
19910 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
19920 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
19930 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
19940 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74  n it .** current
19950 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74  ly is, so detect
19960 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
19970 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
19980 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74  ro byte to .** t
19990 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
199a0 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  w file instead..
199b0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
199c0 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
199d0 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
199e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
199f0 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20  le modifying.** 
19a00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19a10 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
19a20 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
19a30 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
19a40 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
19a50 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
19a60 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
19a70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19a80 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
19a90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
19aa0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
19ab0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19ac0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
19ad0 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69  READER );.  .  i
19ae0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
19af0 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50  ->fd) .   && (pP
19b00 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
19b10 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
19b20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
19b30 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20  te==PAGER_OPEN) 
19b40 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75  .  ){.    i64 cu
19b50 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69  rrentSize, newSi
19b60 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61  ze;.    int szPa
19b70 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
19b80 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  eSize;.    asser
19b90 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
19ba0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
19bb0 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   );.    /* TODO:
19bc0 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75   Is it safe to u
19bd0 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  se Pager.dbFileS
19be0 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20  ize here? */.   
19bf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
19c00 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
19c10 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65  fd, &currentSize
19c20 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  );.    newSize =
19c30 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61   szPage*(i64)nPa
19c40 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
19c50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
19c60 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
19c70 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
19c80 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
19c90 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
19ca0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
19cb0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
19cc0 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
19cd0 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72   }else if( (curr
19ce0 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c  entSize+szPage)<
19cf0 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
19d00 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d      char *pTmp =
19d10 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
19d20 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ce;.        mems
19d30 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61  et(pTmp, 0, szPa
19d40 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ge);.        tes
19d50 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
19d60 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65  szPage) == curre
19d70 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
19d80 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
19d90 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20  Size-szPage) >  
19da0 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
19db0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19dc0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
19dd0 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50  r->fd, pTmp, szP
19de0 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50  age, newSize-szP
19df0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
19e00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19e10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19e20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
19e30 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
19e40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
19e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19e60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61  *.** Return a sa
19e70 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  nitized version 
19e80 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  of the sector-si
19e90 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46  ze of OS file pF
19ea0 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75  ile. The.** retu
19eb0 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72  rn value is guar
19ec0 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65  anteed to lie be
19ed0 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58  tween 32 and MAX
19ee0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
19ef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74  .int sqlite3Sect
19f00 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
19f10 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
19f20 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65  nt iRet = sqlite
19f30 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46  3OsSectorSize(pF
19f40 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74  ile);.  if( iRet
19f50 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20  <32 ){.    iRet 
19f60 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69  = 512;.  }else i
19f70 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54  f( iRet>MAX_SECT
19f80 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61  OR_SIZE ){.    a
19f90 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f  ssert( MAX_SECTO
19fa0 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20  R_SIZE>=512 );. 
19fb0 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45     iRet = MAX_SE
19fc0 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20  CTOR_SIZE;.  }. 
19fd0 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a   return iRet;.}.
19fe0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
19ff0 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
1a000 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1a010 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
1a020 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
1a030 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
1a040 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1a050 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
1a060 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
1a070 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
1a080 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
1a090 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
1a0a0 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  * to determine t
1a0b0 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67  he size and alig
1a0c0 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  nment of journal
1a0d0 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20   header and .** 
1a0e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
1a0f0 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63  ointers within c
1a100 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  reated journal f
1a110 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iles..**.** For 
1a120 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
1a130 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a140 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77  ctor size is alw
1a150 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a  ays 512 bytes..*
1a160 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1a170 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72  for non-temporar
1a180 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66  y files, the eff
1a190 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1a1a0 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c  ze is.** the val
1a1b0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
1a1c0 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29  he xSectorSize()
1a1d0 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20   method rounded 
1a1e0 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69  up to 32 if.** i
1a1f0 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33  t is less than 3
1a200 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f  2, or rounded do
1a210 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52  wn to MAX_SECTOR
1a220 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69  _SIZE if it.** i
1a230 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d  s greater than M
1a240 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
1a250 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1a260 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54 45  e has the SQLITE
1a270 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1a280 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70 65  _OVERWRITE prope
1a290 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  rty, then set.**
1a2a0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1a2b0 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74  ector size to it
1a2c0 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  s minimum value 
1a2d0 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72 70  (512).  The purp
1a2e0 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72  ose of.** pPager
1a2f0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  ->sectorSize is 
1a300 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22 62  to define the "b
1a310 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66 20  last radius" of 
1a320 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69  bytes that.** mi
1a330 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61 20  ght change if a 
1a340 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68 69  crash occurs whi
1a350 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20  le writing to a 
1a360 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a  single byte in.*
1a370 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42  * that range.  B
1a380 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41 46  ut with POWERSAF
1a390 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65  E_OVERWRITE, the
1a3a0 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69 73   blast radius is
1a3b0 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69   zero.** (that i
1a3c0 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46 45  s what POWERSAFE
1a3d0 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73  _OVERWRITE means
1a3e0 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a  ), so we minimiz
1a3f0 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20  e the sector.** 
1a400 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77  size.  For backw
1a410 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
1a420 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  ty of the rollba
1a430 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
1a440 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61  format,.** we ca
1a450 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65 20  nnot reduce the 
1a460 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a470 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e   size below 512.
1a480 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a490 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61  setSectorSize(Pa
1a4a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1a4b0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1a4c0 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
1a4d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1a4e0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1a4f0 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20  >tempFile.   || 
1a500 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
1a510 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1a520 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20  pPager->fd) & . 
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1a540 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1a550 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d  AFE_OVERWRITE)!=
1a560 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  0.  ){.    /* Se
1a570 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
1a580 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
1a590 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
1a5a0 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
1a5b0 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
1a5c0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
1a5d0 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
1a5e0 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
1a5f0 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
1a600 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f  ill segfault. */
1a610 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
1a620 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
1a630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
1a640 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
1a650 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
1a660 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
1a670 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
1a680 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
1a690 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
1a6a0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
1a6b0 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
1a6c0 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
1a6d0 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
1a6e0 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
1a6f0 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
1a700 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
1a710 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
1a720 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
1a730 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
1a740 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
1a750 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
1a760 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1a770 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1a780 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a790 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
1a7a0 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
1a7b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
1a7c0 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
1a7d0 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
1a7e0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1a7f0 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
1a800 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
1a810 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
1a820 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
1a830 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1a840 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1a850 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
1a860 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
1a870 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
1a880 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
1a890 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
1a8a0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1a8b0 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
1a8c0 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
1a8d0 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
1a8e0 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
1a8f0 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
1a900 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a910 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a920 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
1a930 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
1a940 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
1a950 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1a960 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
1a970 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1a980 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1a990 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  page size..**  (
1a9a0 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67  7)  zero padding
1a9b0 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74   out to the next
1a9c0 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a   sector size..**
1a9d0 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (8)  Zero or m
1a9e0 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
1a9f0 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
1aa00 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
1aa10 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
1aa20 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
1aa30 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
1aa40 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
1aa50 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
1aa60 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
1aa70 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
1aa80 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
1aa90 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
1aaa0 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20  ean the first 7 
1aab0 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
1aac0 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
1aad0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
1aae0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1aaf0 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  8th item..**.** 
1ab00 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
1ab10 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
1ab20 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
1ab30 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
1ab40 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
1ab50 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
1ab60 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
1ab70 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
1ab80 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
1ab90 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
1aba0 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
1abb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1abc0 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
1abd0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
1abe0 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
1abf0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1ac00 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
1ac10 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
1ac20 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
1ac30 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1ac40 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
1ac50 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
1ac60 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
1ac70 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
1ac80 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
1ac90 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
1aca0 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
1acb0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1acc0 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
1acd0 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
1ace0 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
1acf0 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
1ad00 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
1ad10 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
1ad20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
1ad30 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
1ad40 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
1ad50 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
1ad60 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
1ad70 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1ad80 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
1ad90 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
1ada0 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
1adb0 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
1adc0 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
1add0 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
1ade0 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
1adf0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
1ae00 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
1ae10 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
1ae20 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
1ae30 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
1ae40 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
1ae50 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
1ae60 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
1ae70 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
1ae80 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
1ae90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1aea0 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
1aeb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1aec0 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
1aed0 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
1aee0 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
1aef0 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
1af00 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
1af10 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
1af20 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
1af30 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
1af40 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
1af50 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
1af60 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
1af70 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
1af80 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
1af90 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
1afa0 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
1afb0 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
1afc0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
1afd0 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
1afe0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1aff0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
1b000 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
1b010 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1b020 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1b030 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
1b040 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
1b050 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
1b060 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
1b070 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
1b080 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
1b090 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
1b0a0 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
1b0b0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1b0c0 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
1b0d0 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
1b0e0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
1b0f0 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
1b100 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
1b110 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
1b120 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
1b130 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
1b140 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
1b150 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
1b160 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
1b170 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
1b180 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
1b190 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
1b1a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1b1b0 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
1b1c0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
1b1d0 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
1b1e0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1b1f0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
1b200 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
1b210 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b220 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b230 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1b240 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
1b250 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b260 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
1b270 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1b280 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
1b290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1b2a0 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1b2b0 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
1b2c0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
1b2d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1b2e0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
1b2f0 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1b300 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b310 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1b320 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
1b330 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
1b340 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1b350 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1b360 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1b370 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
1b380 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
1b390 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1b3a0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
1b3b0 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
1b3c0 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
1b3d0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
1b3e0 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
1b3f0 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
1b400 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
1b410 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b  .  int nPlayback
1b420 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
1b430 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1b440 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66 72  ages restored fr
1b450 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20  om journal */.. 
1b460 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1b470 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
1b480 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
1b490 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
1b4a0 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
1b4b0 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
1b4c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
1b4d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1b4e0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
1b4f0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1b500 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
1b510 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1b520 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
1b530 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1b540 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
1b550 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1b560 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
1b570 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
1b580 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
1b590 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1b5a0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
1b5b0 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
1b5c0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
1b5d0 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
1b5e0 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
1b5f0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
1b600 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
1b610 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
1b620 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
1b630 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
1b640 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
1b650 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
1b660 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
1b670 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
1b680 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
1b690 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
1b6a0 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
1b6b0 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
1b6c0 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
1b6d0 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
1b6e0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1b6f0 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
1b700 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
1b710 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
1b720 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
1b730 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
1b740 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
1b750 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
1b760 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
1b770 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1b780 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
1b790 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1b7a0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1b7b0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1b7c0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1b7d0 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
1b7e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1b7f0 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
1b800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1b810 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
1b820 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
1b830 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
1b840 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
1b850 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
1b860 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
1b870 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1b880 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
1b890 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b8a0 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
1b8b0 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
1b8c0 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
1b8d0 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
1b8e0 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
1b8f0 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
1b900 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
1b910 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
1b920 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
1b930 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
1b940 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
1b950 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
1b960 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
1b970 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
1b980 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
1b990 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
1b9a0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
1b9b0 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
1b9c0 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
1b9d0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
1b9e0 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
1b9f0 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
1ba00 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
1ba10 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
1ba20 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66  cess must have f
1ba30 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
1ba40 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
1ba50 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
1ba60 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
1ba70 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1ba80 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
1ba90 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
1baa0 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74  dr(pPager, isHot
1bab0 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
1bac0 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
1bad0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
1bae0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1baf0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1bb00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1bb10 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1bb20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1bb30 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
1bb40 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
1bb50 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1bb60 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
1bb70 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1bb80 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
1bb90 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
1bba0 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
1bbb0 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
1bbc0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
1bbd0 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
1bbe0 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
1bbf0 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
1bc00 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
1bc10 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
1bc20 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1bc30 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
1bc40 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
1bc50 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1bc60 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
1bc70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1bc80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1bc90 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1bca0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
1bcb0 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1bcc0 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
1bcd0 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
1bce0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1bcf0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1bd00 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
1bd10 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
1bd20 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
1bd30 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
1bd40 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
1bd50 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
1bd60 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
1bd70 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
1bd80 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
1bd90 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
1bda0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
1bdb0 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1bdc0 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
1bdd0 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
1bde0 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
1bdf0 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
1be00 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1be10 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
1be20 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
1be30 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
1be40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1be50 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
1be60 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
1be70 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
1be80 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20  t #2565..    ** 
1be90 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
1bea0 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c  k a hot journal,
1beb0 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20   nRec==0 always 
1bec0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
1bed0 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b  ext.    ** chunk
1bee0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1bef0 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61  contains zero pa
1bf00 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  ges to be rolled
1bf10 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20   back.  But.    
1bf20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** when doing a 
1bf30 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65  ROLLBACK and the
1bf40 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69   nRec==0 chunk i
1bf50 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b  s the last chunk
1bf60 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
1bf70 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73  ournal, it means
1bf80 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1bf90 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
1bfa0 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a  additional.    *
1bfb0 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65  * pages that nee
1bfc0 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  d to be rolled b
1bfd0 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
1bfe0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1bff0 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20   .    ** should 
1c000 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65  be computed base
1c010 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1c020 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20   file size..    
1c030 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1c040 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a  =0 && !isHot &&.
1c050 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c060 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
1c070 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1c080 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
1c090 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e  alOff ){.      n
1c0a0 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1c0b0 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
1c0c0 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
1c0d0 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1c0e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1c0f0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1c100 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
1c110 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1c120 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1c130 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1c140 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
1c150 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
1c160 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1c170 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c180 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1c190 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1c1a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
1c1b0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
1c1c0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1c1d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c1e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1c1f0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1c200 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1c210 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
1c220 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
1c230 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
1c240 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
1c250 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
1c260 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  to the .    ** d
1c270 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1c280 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a  /or page cache..
1c290 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75      */.    for(u
1c2a0 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29  =0; u<nRec; u++)
1c2b0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
1c2c0 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20  PagerReset ){.  
1c2d0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1c2e0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1c2f0 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65     needPagerRese
1c300 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1c310 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1c320 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1c330 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72  e(pPager,&pPager
1c340 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31  ->journalOff,0,1
1c350 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ,0);.      if( r
1c360 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c370 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63          nPlaybac
1c380 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  k++;.      }else
1c390 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
1c3a0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1c3b0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1c3c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1c3d0 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
1c3e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1c3f0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
1c400 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1c410 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
1c420 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
1c430 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e  al has been trun
1c440 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74  cated, simply st
1c450 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20  op reading and. 
1c460 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1c470 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  essing the journ
1c480 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68  al. This might h
1c490 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75  appen if the jou
1c4a0 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20  rnal was.       
1c4b0 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65     ** not comple
1c4c0 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64  tely written and
1c4d0 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f   synced prior to
1c4e0 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68   a crash.  In th
1c4f0 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
1c500 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61  case, the databa
1c510 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e  se should have n
1c520 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
1c530 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  n in the.       
1c540 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63     ** first plac
1c550 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f  e so it is OK to
1c560 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20   simply abandon 
1c570 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f  the rollback. */
1c580 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1c5a0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1c5b0 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1c5c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c5d0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
1c5e0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
1c5f0 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72  , quit and retur
1c600 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  n the error.    
1c610 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20        ** code.  
1c620 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
1c630 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
1c640 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
1c650 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
1c660 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68  so that no furth
1c670 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20  er harm will be 
1c680 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74  done.  Perhaps t
1c690 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20  he next.        
1c6a0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20    ** process to 
1c6b0 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20  come along will 
1c6c0 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
1c6d0 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
1c6e0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1c6f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1c700 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1c710 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1c720 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
1c730 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
1c740 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
1c750 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c  yback:.  /* Foll
1c760 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
1c770 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
1c780 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
1c790 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
1c7a0 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
1c7b0 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
1c7c0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
1c7d0 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
1c7e0 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
1c7f0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1c800 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
1c810 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
1c820 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
1c830 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
1c840 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1c850 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
1c860 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1c870 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1c880 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1c890 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ds ){.    sqlite
1c8a0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
1c8b0 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51  nt(pPager->fd,SQ
1c8c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1c8d0 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a  CHANGED,0);.  }.
1c8e0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1c8f0 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
1c900 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
1c910 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
1c920 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
1c930 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
1c940 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
1c950 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
1c960 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
1c970 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
1c980 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
1c990 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
1c9a0 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
1c9b0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
1c9c0 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
1c9d0 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
1c9e0 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
1c9f0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
1ca00 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
1ca10 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
1ca20 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
1ca30 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
1ca40 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
1ca50 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
1ca60 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
1ca70 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
1ca80 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
1ca90 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
1caa0 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
1cab0 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
1cac0 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
1cad0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
1cae0 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
1caf0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
1cb00 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
1cb10 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
1cb20 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
1cb30 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1cb40 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1cb50 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
1cb60 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
1cb70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cb80 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
1cb90 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1cba0 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1cbb0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1cbc0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1cbd0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1cbe0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
1cbf0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1cc00 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1cc10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cc20 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  OK.   && (pPager
1cc30 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1cc40 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1cc50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1cc60 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b  PAGER_OPEN).  ){
1cc70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1cc80 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65  3PagerSync(pPage
1cc90 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  r, 0);.  }.  if(
1cca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ccb0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1ccc0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1ccd0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1cce0 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20  [0]!='\0', 0);. 
1ccf0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1cd00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1cd10 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1cd20 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1cd30 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20  [0] && res ){.  
1cd40 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
1cd50 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
1cd60 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
1cd70 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1cd80 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
1cd90 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
1cda0 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
1cdb0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1cdc0 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
1cdd0 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
1cde0 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
1cdf0 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ter);.    testca
1ce00 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1ce10 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  K );.  }.  if( i
1ce20 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63  sHot && nPlaybac
1ce30 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
1ce40 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49  _log(SQLITE_NOTI
1ce50 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
1ce60 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20  ACK, "recovered 
1ce70 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73  %d pages from %s
1ce80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1ce90 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50     nPlayback, pP
1cea0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
1ceb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
1cec0 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1ced0 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
1cee0 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
1cef0 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
1cf00 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
1cf10 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1cf20 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
1cf30 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
1cf40 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
1cf50 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
1cf60 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
1cf70 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
1cf80 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
1cf90 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
1cfa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1cfb0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
1cfc0 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
1cfd0 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
1cfe0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
1cff0 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
1d000 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
1d010 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
1d020 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
1d030 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1d040 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
1d050 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1d060 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1d070 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
1d080 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
1d090 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
1d0a0 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
1d0b0 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
1d0c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d0d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
1d0e0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
1d0f0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
1d100 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
1d110 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
1d120 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1d130 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1d140 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1d150 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
1d160 72 20 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61  r *pPg, u32 iFra
1d170 6d 65 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  me){.  Pager *pP
1d180 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1d190 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a  er; /* Pager obj
1d1a0 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1d1b0 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a  ith page pPg */.
1d1c0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1d1d0 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f  g->pgno;       /
1d1e0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1d1f0 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72   read */.  int r
1d200 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1d210 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1d220 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1d230 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70  pgsz = pPager->p
1d240 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62  ageSize; /* Numb
1d250 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
1d260 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
1d270 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1d280 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
1d290 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
1d2a0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1d2b0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66  ger->fd) );..#if
1d2c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d2d0 5f 57 41 4c 0a 20 20 69 66 28 20 69 46 72 61 6d  _WAL.  if( iFram
1d2e0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20  e ){.    /* Try 
1d2f0 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65  to pull the page
1d300 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d   from the write-
1d310 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20  ahead log. */.  
1d320 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1d330 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61 67 65  lReadFrame(pPage
1d340 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c  r->pWal, iFrame,
1d350 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74   pgsz, pPg->pDat
1d360 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  a);.  }else.#end
1d370 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69  if.  {.    i64 i
1d380 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
1d390 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1d3a0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
1d3b0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1d3c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
1d3d0 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f  >pData, pgsz, iO
1d3e0 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ffset);.    if( 
1d3f0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1d400 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1d410 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d420 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
1d430 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1d440 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1d450 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
1d460 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73  ead is unsuccess
1d470 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46  ful, set the dbF
1d480 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d  ileVers[] to som
1d490 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ething.      ** 
1d4a0 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
1d4b0 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20  be a valid file 
1d4c0 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65  version.  dbFile
1d4d0 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79  Vers[] is a copy
1d4e0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74  .      ** of byt
1d4f0 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  es 24..39 of the
1d500 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65   database.  Byte
1d510 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20  s 28..31 should 
1d520 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20  always be.      
1d530 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73  ** zero or the s
1d540 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1d550 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74  ase in page. Byt
1d560 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35  es 32..35 and 35
1d570 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68  ..39.      ** sh
1d580 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
1d590 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e  bers which are n
1d5a0 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e  ever 0xffffffff.
1d5b0 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20    So filling.   
1d5c0 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62     ** pPager->db
1d5d0 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
1d5e0 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73  all 0xff bytes s
1d5f0 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20  hould suffice.. 
1d600 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1d610 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65   For an encrypte
1d620 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  d database, the 
1d630 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72  situation is mor
1d640 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65  e complex:  byte
1d650 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33  s.      ** 24..3
1d660 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1d670 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73  e are white nois
1d680 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62  e.  But the prob
1d690 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20  ability of.     
1d6a0 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20   ** white noise 
1d6b0 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1d6c0 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1d6d0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1d6e0 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1d6f0 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1d700 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1d710 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1d720 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1d730 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1d740 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1d750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d760 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1d770 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1d780 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1d790 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1d7a0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1d7b0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1d7c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d7d0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1d7e0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1d7f0 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  Pg->pData, pgno,
1d800 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   3, rc = SQLITE_
1d810 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52  NOMEM);..  PAGER
1d820 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1d830 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1d840 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1d850 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1d860 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1d870 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1d880 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1d890 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1d8a0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1d8b0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1d8c0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1d8d0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1d8e0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1d8f0 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1d900 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1d910 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1d920 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1d930 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1d940 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1d950 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1d960 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1d970 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1d980 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1d990 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1d9a0 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1d9b0 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1d9c0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1d9d0 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1d9e0 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1d9f0 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1da00 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1da10 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1da20 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1da30 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1da40 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1da50 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1da60 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1da70 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1da80 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1da90 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1daa0 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1dab0 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1dac0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1dad0 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1dae0 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1daf0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1db00 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1db10 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1db20 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1db30 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1db40 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1db50 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1db60 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1db70 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1db80 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1db90 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1dba0 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1dbb0 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1dbc0 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1dbd0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1dbe0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1dbf0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1dc00 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1dc10 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1dc20 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1dc30 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1dc40 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1dc50 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1dc60 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1dc70 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1dc80 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1dc90 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1dca0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1dcb0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1dcc0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1dcd0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1dce0 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1dcf0 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1dd00 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1dd10 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1dd20 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1dd30 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1dd40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1dd50 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1dd60 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1dd70 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1dd80 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1dd90 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1dda0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1ddb0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1ddc0 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1ddd0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1dde0 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1ddf0 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1de00 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1de10 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1de20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1de30 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1de40 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1de50 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1de60 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1de70 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1de80 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1de90 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1dea0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1deb0 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1dec0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1ded0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1dee0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1def0 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1df00 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1df10 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1df20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1df30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1df40 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1df50 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1df60 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1df70 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1df80 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1df90 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65  ;.  pPg = sqlite
1dfa0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
1dfb0 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28  ger, iPg);.  if(
1dfc0 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20   pPg ){.    if( 
1dfd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1dfe0 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d  eRefcount(pPg)==
1dff0 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1e000 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
1e010 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e020 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d      u32 iFrame =
1e030 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
1e040 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
1e050 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1e060 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72   pPg->pgno, &iFr
1e070 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
1e080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e090 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
1e0a0 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46  adDbPage(pPg, iF
1e0b0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rame);.      }. 
1e0c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e0d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e0e0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1e0f0 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1e100 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1e110 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
1e120 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1e130 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1e140 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1e150 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1e160 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1e170 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1e180 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1e190 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1e1a0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1e1b0 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1e1c0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1e1d0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1e1e0 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1e1f0 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1e200 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1e210 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1e220 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1e230 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1e240 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1e250 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1e260 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1e270 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1e280 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1e290 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1e2a0 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1e2b0 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1e2c0 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1e2d0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1e2e0 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1e2f0 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1e300 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1e310 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1e320 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1e330 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1e340 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1e350 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e360 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1e370 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1e380 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1e390 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e3a0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1e3b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e3c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1e3f0 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1e400 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1e410 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1e420 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1e430 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1e440 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1e450 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1e460 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1e470 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1e480 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1e490 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1e4a0 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1e4b0 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1e4c0 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1e4d0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1e4e0 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1e4f0 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1e500 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1e510 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1e520 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1e530 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1e540 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1e550 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1e560 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1e570 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1e580 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1e590 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1e5a0 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1e5b0 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1e5c0 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1e5d0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1e5e0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1e5f0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77  r->pPCache);.  w
1e600 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72  hile( pList && r
1e610 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e620 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
1e630 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1e640 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1e650 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f  UndoCallback((vo
1e660 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  id *)pPager, pLi
1e670 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  st->pgno);.    p
1e680 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
1e690 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1e6a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1e6b0 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
1e6c0 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
1e6d0 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41  e3WalFrames(). A
1e6e0 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e  s well as loggin
1e6f0 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
1e700 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66  s of the list of
1e710 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79   pages headed by
1e720 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65   pList (connecte
1e730 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a  d by pDirty),.**
1e740 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
1e750 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69  otifies any acti
1e760 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ve backup proces
1e770 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ses that the pag
1e780 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67  es have.** chang
1e790 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ed. .**.** The l
1e7a0 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73  ist of pages pas
1e7b0 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f  sed into this ro
1e7c0 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20  utine is always 
1e7d0 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e  sorted by page n
1e7e0 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c  umber..** Hence,
1e7f0 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61   if page 1 appea
1e800 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  rs anywhere on t
1e810 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c  he list, it will
1e820 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61   be the first pa
1e830 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ge..*/ .static i
1e840 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  nt pagerWalFrame
1e850 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
1e860 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1e870 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1e880 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ject */.  PgHdr 
1e890 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
1e8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1e8b0 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c  t of frames to l
1e8c0 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72  og */.  Pgno nTr
1e8d0 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1e8e0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1e8f0 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ase size after t
1e900 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  his commit */.  
1e910 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e930 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1e940 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29  is a commit */.)
1e950 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e970 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e980 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73  de */.  int nLis
1e990 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1e9a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e9b0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c  r of pages in pL
1e9c0 69 73 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ist */.#if defin
1e9d0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1e9e0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1e9f0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 29 0a  TE_CHECK_PAGES).
1ea00 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1ea30 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 23   over pages */.#
1ea40 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1ea50 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b   pPager->pWal );
1ea60 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1ea70 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1ea80 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
1ea90 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
1eaa0 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63  e list is in acc
1eab0 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
1eac0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1ead0 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70   && p->pDirty; p
1eae0 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1eaf0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f   assert( p->pgno
1eb00 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67   < p->pDirty->pg
1eb10 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  no );.  }.#endif
1eb20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ..  assert( pLis
1eb30 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20  t->pDirty==0 || 
1eb40 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66  isCommit );.  if
1eb50 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ( isCommit ){.  
1eb60 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72    /* If a WAL tr
1eb70 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
1eb80 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  ng committed, th
1eb90 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
1eba0 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a  in writing.    *
1ebb0 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68  * any pages with
1ebc0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1ebd0 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e  eater than nTrun
1ebe0 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41  cate into the WA
1ebf0 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54  L file..    ** T
1ec00 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hey will never b
1ec10 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c  e read by any cl
1ec20 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20  ient. So remove 
1ec30 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44  them from the pD
1ec40 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74  irty.    ** list
1ec50 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67   here. */.    Pg
1ec60 48 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48 64  Hdr *p;.    PgHd
1ec70 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c  r **ppNext = &pL
1ec80 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  ist;.    nList =
1ec90 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   0;.    for(p=pL
1eca0 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20  ist; (*ppNext = 
1ecb0 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72  p)!=0; p=p->pDir
1ecc0 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ty){.      if( p
1ecd0 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74  ->pgno<=nTruncat
1ece0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e  e ){.        ppN
1ecf0 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79  ext = &p->pDirty
1ed00 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b  ;.        nList+
1ed10 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1ed20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
1ed30 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
1ed40 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20     nList = 1;.  
1ed50 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61  }.  pPager->aSta
1ed60 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
1ed70 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20  TE] += nList;.. 
1ed80 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
1ed90 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
1eda0 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
1edb0 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73  pList);.  rc = s
1edc0 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1edd0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20  pPager->pWal, . 
1ede0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
1edf0 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54  eSize, pList, nT
1ee00 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69  runcate, isCommi
1ee10 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t, pPager->walSy
1ee20 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69  ncFlags.  );.  i
1ee30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ee40 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63   && pPager->pBac
1ee50 6b 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72  kup ){.    PgHdr
1ee60 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
1ee70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
1ee80 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c  irty){.      sql
1ee90 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
1eea0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
1eeb0 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a  , p->pgno, (u8 *
1eec0 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  )p->pData);.    
1eed0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
1eee0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1eef0 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1ef00 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1ef10 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1ef20 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73  e);.  for(p=pLis
1ef30 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1ef40 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65  y){.    pager_se
1ef50 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20  t_pagehash(p);. 
1ef60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
1ef70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ef80 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72   Begin a read tr
1ef90 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1efa0 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   WAL..**.** This
1efb0 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f   routine used to
1efc0 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65   be called "page
1efd0 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22  rOpenSnapshot()"
1efe0 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65   because it esse
1eff0 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73  ntially.** makes
1f000 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74   a snapshot of t
1f010 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  he database at t
1f020 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74  he current point
1f030 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65   in time and pre
1f040 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73  serves.** that s
1f050 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20  napshot for use 
1f060 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e  by the reader in
1f070 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72   spite of concur
1f080 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62  rently changes b
1f090 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65  y.** other write
1f0a0 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  rs or checkpoint
1f0b0 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
1f0c0 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  nt pagerBeginRea
1f0d0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  dTransaction(Pag
1f0e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1f0f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f110 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1f120 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d  .  int changed =
1f130 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f140 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
1f150 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65  che must be rese
1f160 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
1f170 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1f180 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
1f190 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f1a0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
1f1b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1f1c0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a  AGER_READER );..
1f1d0 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45    /* sqlite3WalE
1f1e0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1f1f0 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  n() was not call
1f200 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ed for the previ
1f210 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ous.  ** transac
1f220 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  tion in locking_
1f230 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20  mode=EXCLUSIVE. 
1f240 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e   So call it now.
1f250 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65    If we.  ** are
1f260 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1f270 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52  =NORMAL and EndR
1f280 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f  ead() was previo
1f290 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a  usly called,.  *
1f2a0 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  * the duplicate 
1f2b0 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73  call is harmless
1f2c0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1f2d0 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1f2e0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
1f2f0 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  al);..  rc = sql
1f300 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64  ite3WalBeginRead
1f310 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1f320 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67  er->pWal, &chang
1f330 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ed);.  if( rc!=S
1f340 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e  QLITE_OK || chan
1f350 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72  ged ){.    pager
1f360 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1f370 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48      if( USEFETCH
1f380 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74  (pPager) ) sqlit
1f390 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
1f3a0 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
1f3b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1f3c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1f3d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1f3e0 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
1f3f0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
1f400 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50  on from PAGER_OP
1f410 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52  EN.** to PAGER_R
1f420 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64  EADER state to d
1f430 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1f440 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1f450 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67  e file.** in pag
1f460 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  es (assuming the
1f470 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65   page size curre
1f480 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50  ntly stored in P
1f490 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a  ager.pageSize)..
1f4a0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
1f4b0 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
1f4c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1f4d0 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1f4e0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1f4f0 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72  in pages is stor
1f500 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f  ed in *pnPage. O
1f510 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
1f520 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73  or code (perhaps
1f530 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
1f540 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72  _FSTAT) is retur
1f550 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
1f560 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
1f570 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1f580 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  t pagerPagecount
1f590 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1f5a0 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20  Pgno *pnPage){. 
1f5b0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5d0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1f5e0 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
1f5f0 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74  */..  /* Query t
1f600 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1f610 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  m for the databa
1f620 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c  se size. The Wal
1f630 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75  Dbsize().  ** fu
1f640 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a  nction returns z
1f650 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69  ero if the WAL i
1f660 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e  s not open (i.e.
1f670 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c   Pager.pWal==0),
1f680 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20   or.  ** if the 
1f690 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1f6a0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
1f6b0 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1f6c0 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76  e is not.  ** av
1f6d0 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1f6e0 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
1f6f0 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  if the log file 
1f700 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a  is empty or.  **
1f710 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c   contains no val
1f720 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61  id committed tra
1f730 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  nsactions..  */.
1f740 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f750 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f760 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1f770 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1f780 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1f790 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
1f7a0 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65  3WalDbsize(pPage
1f7b0 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20  r->pWal);..  /* 
1f7c0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1f7d0 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61  size was not ava
1f7e0 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1f7f0 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a  WAL sub-system,.
1f800 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69    ** determine i
1f810 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
1f820 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f830 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
1f840 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68   size.  ** of th
1f850 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f860 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
1f870 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
1f880 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a  e page-size,.  *
1f890 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20  * round down to 
1f8a0 74 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65  the nearest page
1f8b0 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69  . Except, any fi
1f8c0 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30  le larger than 0
1f8d0 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  .  ** bytes in s
1f8e0 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
1f8f0 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20  d to contain at 
1f900 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a  least one page..
1f910 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1f920 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  ==0 ){.    i64 n
1f930 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f940 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1f950 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62   of db file in b
1f960 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  ytes */.    asse
1f970 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1f980 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1f990 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1f9a0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1f9b0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1f9c0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1f9d0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1f9e0 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
1f9f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fa00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fa10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fa20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50    }.    }.    nP
1fa30 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b  age = (Pgno)((n+
1fa40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fa50 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  -1) / pPager->pa
1fa60 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
1fa70 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1fa80 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1fa90 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1faa0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1fab0 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
1fac0 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
1fad0 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
1fae0 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
1faf0 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
1fb00 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
1fb10 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
1fb20 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
1fb30 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
1fb40 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
1fb50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
1fb60 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
1fb70 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1fb80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1fb90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1fba0 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  L./*.** Check if
1fbb0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1fbc0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
1fbd0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1fbe0 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
1fbf0 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
1fc00 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1fc10 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
1fc20 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
1fc30 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
1fc40 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
1fc50 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
1fc60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1fc70 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
1fc80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1fc90 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
1fca0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
1fcb0 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
1fcc0 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
1fcd0 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
1fce0 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
1fcf0 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
1fd00 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
1fd10 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
1fd20 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
1fd30 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
1fd40 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
1fd50 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
1fd60 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
1fd70 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1fd80 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1fd90 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  e..**.** The cal
1fda0 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20  ler must hold a 
1fdb0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
1fdc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fdd0 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a   to call this.**
1fde0 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75   function. Becau
1fdf0 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  se an EXCLUSIVE 
1fe00 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66  lock on the db f
1fe10 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
1fe20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20  to delete .** a 
1fe30 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d  WAL on a none-em
1fe40 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  pty database, th
1fe50 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
1fe60 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
1fe70 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65  ition .** betwee
1fe80 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
1fe90 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
1fea0 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
1feb0 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a  cuted by some .*
1fec0 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
1fed0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1fee0 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
1fef0 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
1ff00 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1ff10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ff20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ff30 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1ff40 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
1ff50 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
1ff60 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
1ff70 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
1ff80 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
1ff90 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20  t isWal;        
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ffb0 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20  rue if WAL file 
1ffc0 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67  exists */.    Pg
1ffd0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1fff0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20000 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
20010 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
20020 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
20030 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20040 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20050 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
20060 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20070 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
20080 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
20090 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20  r->zWal, 0);.   
200a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
200b0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
200c0 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49  OENT ) rc = SQLI
200d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57  TE_OK;.      isW
200e0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  al = 0;.    }els
200f0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
20100 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
20110 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
20120 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
20130 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
20140 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
20150 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  l.      );.    }
20160 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20180 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
20190 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
201a0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
201b0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
201c0 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
201d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
201e0 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
201f0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
20200 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
20210 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
20220 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20230 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
20240 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20250 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
20260 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
20270 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20280 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20290 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
202a0 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
202b0 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
202c0 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
202d0 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
202e0 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
202f0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
20300 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
20310 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
20320 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
20330 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
20340 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
20350 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
20360 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
20370 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
20380 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
20390 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
203a0 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
203b0 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
203c0 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
203d0 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
203e0 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
203f0 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
20400 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
20410 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
20420 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
20430 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
20440 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
20450 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
20460 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
20470 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
20480 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
20490 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
204a0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
204b0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
204c0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
204d0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
204e0 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
204f0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20500 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
20510 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
20520 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
20530 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
20540 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
20550 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
20560 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
20570 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
20580 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
20590 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
205a0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
205b0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
205c0 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
205d0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
205e0 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
205f0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20600 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
20610 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
20620 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
20630 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
20640 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
20650 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
20660 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
20670 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
20680 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
20690 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
206a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
206b0 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
206c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
206d0 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
206e0 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
206f0 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
20700 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
20710 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
20720 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
20730 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
20740 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
20750 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
20760 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
20770 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
20780 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
20790 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
207a0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
207b0 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
207c0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
207d0 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
207e0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
207f0 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
20800 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
20810 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
20820 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
20830 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
20840 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
20850 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
20860 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
20870 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
20880 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
20890 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
208a0 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
208b0 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
208c0 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
208d0 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
208e0 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
208f0 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
20900 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
20910 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
20920 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
20930 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
20940 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
20950 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
20960 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
20970 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
20980 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
20990 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
209a0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
209b0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
209c0 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
209d0 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
209e0 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
209f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
20a00 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
20a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
20a20 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
20a30 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
20a40 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
20a50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20a60 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
20a70 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
20a80 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
20a90 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
20aa0 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
20ab0 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
20ac0 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
20ad0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20ae0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
20af0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20b00 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
20b10 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
20b20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
20b30 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
20b40 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
20b50 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
20b60 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
20b70 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
20b80 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
20b90 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
20ba0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20bb0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
20bc0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
20bd0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
20be0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20bf0 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
20c00 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
20c10 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
20c20 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
20c30 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
20c40 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
20c50 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
20c60 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
20c70 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
20c80 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
20c90 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
20ca0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  ;.  pPager->chan
20cb0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
20cc0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
20cd0 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69  .  if( !pSavepoi
20ce0 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61  nt && pagerUseWa
20cf0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
20d00 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c   return pagerRol
20d10 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29  lbackWal(pPager)
20d20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20  ;.  }..  /* Use 
20d30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20d40 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
20d50 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
20d60 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
20d70 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
20d80 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
20d90 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
20da0 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
20db0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20dc0 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
20dd0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
20de0 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
20df0 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
20e00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20e10 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
20e20 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
20e30 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
20e40 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72  rnalOff;.  asser
20e50 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
20e60 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a  Pager)==0 || szJ
20e70 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  ==0 );..  /* Beg
20e80 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
20e90 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
20ea0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20eb0 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
20ec0 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
20ed0 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
20ee0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
20ef0 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
20f00 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
20f10 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
20f20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
20f30 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
20f40 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
20f50 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
20f60 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
20f70 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
20f80 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
20f90 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
20fa0 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
20fb0 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
20fc0 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
20fd0 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
20fe0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
20ff0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
21000 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73  oint && !pagerUs
21010 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21020 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
21030 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
21040 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
21050 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
21060 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
21070 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
21080 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
21090 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
210a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
210b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
210c0 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
210d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
210e0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
210f0 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
21100 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
21110 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
21120 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21130 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
21140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
21150 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21160 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
21170 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20  ontinue rolling 
21180 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74  back records out
21190 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
211a0 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
211b0 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
211c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
211d0 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  een and continui
211e0 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66  ng until the eff
211f0 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20  ective end.  ** 
21200 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21210 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69  nal file.  Conti
21220 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d  nue to skip out-
21230 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
21240 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65  nd.  ** continue
21250 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f   adding pages ro
21260 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f  lled back to pDo
21270 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ne..  */.  while
21280 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21290 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
212a0 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20  alOff<szJ ){.   
212b0 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
212c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
212d0 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  ter */.    u32 n
212e0 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a  JRec = 0;     /*
212f0 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
21300 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
21310 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
21320 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
21330 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20  lHdr(pPager, 0, 
21340 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
21350 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
21360 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21370 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
21380 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
21390 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
213a0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
213b0 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
213c0 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
213d0 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
213e0 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
213f0 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
21400 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
21410 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
21420 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
21430 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
21440 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
21450 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
21460 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
21470 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
21480 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
21490 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
214a0 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20  nalOff.    ){.  
214b0 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32      nJRec = (u32
214c0 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
214d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55  >journalOff)/JOU
214e0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
214f0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  r));.    }.    f
21500 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
21510 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52  ITE_OK && ii<nJR
21520 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ec && pPager->jo
21530 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69  urnalOff<szJ; ii
21540 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
21550 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
21560 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
21570 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
21580 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
21590 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
215a0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
215b0 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
215c0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
215d0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
215e0 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29  ournalOff>=szJ )
215f0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
21600 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
21610 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
21620 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
21630 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
21640 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
21650 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
21660 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
21670 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
21680 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
21690 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
216a0 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
216b0 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
216c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
216d0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
216e0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
216f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
21700 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
21710 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f  t = (i64)pSavepo
21720 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
21730 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21740 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
21750 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21760 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
21770 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e  lite3WalSavepoin
21780 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  tUndo(pPager->pW
21790 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  al, pSavepoint->
217a0 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d  aWalData);.    }
217b0 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76  .    for(ii=pSav
217c0 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b  epoint->iSubRec;
217d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
217e0 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75  & ii<pPager->nSu
217f0 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  bRec; ii++){.   
21800 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
21810 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50  t==(i64)ii*(4+pP
21820 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
21830 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
21840 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
21850 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
21860 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
21870 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21880 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21890 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
218a0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
218b0 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
218c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
218d0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
218e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
218f0 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
21900 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
21910 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
21920 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
21930 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
21940 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
21950 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21960 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
21970 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
21980 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
21990 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
219a0 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
219b0 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
219c0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
219d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
219e0 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20  P_SIZE based on 
219f0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
21a00 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a  e of szMmap..*/.
21a10 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
21a20 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67  rFixMaplimit(Pag
21a30 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66  er *pPager){.#if
21a40 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
21a50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65  _SIZE>0.  sqlite
21a60 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61  3_file *fd = pPa
21a70 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69  ger->fd;.  if( i
21a80 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d  sOpen(fd) && fd-
21a90 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
21aa0 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71  ion>=3 ){.    sq
21ab0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
21ac0 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d      sz = pPager-
21ad0 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61  >szMmap;.    pPa
21ae0 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d  ger->bUseFetch =
21af0 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 71 6c   (sz>0);.    sql
21b00 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
21b10 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
21b20 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  , SQLITE_FCNTL_M
21b30 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a  MAP_SIZE, &sz);.
21b40 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
21b50 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
21b60 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  aximum size of a
21b70 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  ny memory mappin
21b80 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64 61  g made of the da
21b90 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
21ba0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21bb0 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61  rSetMmapLimit(Pa
21bc0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c  ger *pPager, sql
21bd0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
21be0 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a  p){.  pPager->sz
21bf0 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20  Mmap = szMmap;. 
21c00 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
21c10 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  t(pPager);.}../*
21c20 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63 68  .** Free as much
21c30 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
21c40 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ble from the pag
21c50 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
21c60 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50  te3PagerShrink(P
21c70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21c80 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68   sqlite3PcacheSh
21c90 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50 43  rink(pPager->pPC
21ca0 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
21cb0 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73 20  Adjust settings 
21cc0 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  of the pager to 
21cd0 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
21ce0 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20 70  in the pgFlags p
21cf0 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
21d00 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20 70  The "level" in p
21d10 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53  gFlags & PAGER_S
21d20 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20  YNCHRONOUS_MASK 
21d30 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74 6e  sets the robustn
21d40 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ess.** of the da
21d50 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
21d60 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
21d70 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  es or power fail
21d80 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67  ures by.** chang
21d90 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
21da0 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
21db0 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
21dc0 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61  nals..** There a
21dd0 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
21de0 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
21df0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
21e00 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
21e10 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
21e20 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
21e30 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
21e40 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
21e50 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
21e60 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
21e70 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
21e80 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
21e90 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
21ea0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
21eb0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
21ec0 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
21ed0 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
21ee0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
21ef0 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
21f00 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
21f10 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
21f20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
21f30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
21f40 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
21f50 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
21f60 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
21f70 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
21f80 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
21f90 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
21fa0 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
21fb0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
21fd0 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
21fe0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
21ff0 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
22000 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
22010 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
22020 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
22040 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
22050 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
22060 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
22070 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
22080 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
22090 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
220a0 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
220b0 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
220c0 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
220d0 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
220e0 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
220f0 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
22100 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
22110 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
22120 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
22130 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
22150 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
22160 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
22170 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
22180 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
22190 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
221a0 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
221b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
221c0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
221d0 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
221e0 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b  s for a rollback
221f0 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20  -journal mode.  
22200 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46  For WAL mode, OF
22210 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74  F continues.** t
22220 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73  o mean that no s
22230 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e  yncs ever occur.
22240 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74    NORMAL means t
22250 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73  hat the WAL is s
22260 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  ynced.** prior t
22270 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63  o the start of c
22280 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68  heckpoint and th
22290 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
222a0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a  file is synced.*
222b0 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
222c0 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b  ion of the check
222d0 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74  point if the ent
222e0 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ire content of t
222f0 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72  he WAL.** was wr
22300 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
22310 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
22320 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61  ut no sync opera
22330 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a  tions occur for.
22340 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63  ** an ordinary c
22350 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20  ommit in NORMAL 
22360 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20  mode with WAL.  
22370 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  FULL means that 
22380 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20  the WAL.** file 
22390 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  is synced follow
223a0 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20  ing each commit 
223b0 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64  operation, in ad
223c0 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  dition to the.**
223d0 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65   syncs associate
223e0 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a  d with NORMAL..*
223f0 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66  *.** Do not conf
22400 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  use synchronous=
22410 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45  FULL with SQLITE
22420 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65  _SYNC_FULL.  The
22430 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  .** SQLITE_SYNC_
22440 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73  FULL macro means
22450 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f   to use the MacO
22460 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73  SX-style full-fs
22470 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e  ync.** using fcn
22480 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e  tl(F_FULLFSYNC).
22490 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f    SQLITE_SYNC_NO
224a0 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f  RMAL means to do
224b0 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20   an.** ordinary 
224c0 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54  fsync() call.  T
224d0 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65  here is no diffe
224e0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51  rence between SQ
224f0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a  LITE_SYNC_FULL.*
22500 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e  * and SQLITE_SYN
22510 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74  C_NORMAL on plat
22520 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e  forms other than
22530 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68   MacOSX.  But th
22540 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73  e.** synchronous
22550 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e  =FULL versus syn
22560 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20  chronous=NORMAL 
22570 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e  setting determin
22580 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78  es when.** the x
22590 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69  Sync primitive i
225a0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20  s called and is 
225b0 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20  relevant to all 
225c0 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a  platforms..**.**
225d0 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
225e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
225f0 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
22600 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
22610 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
22620 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22630 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
22640 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
22650 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
22660 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
22670 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
22680 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61   pager to set sa
22690 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a  fety level for *
226a0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
226b0 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72  lags      /* Var
226c0 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ious flags */.){
226d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65  .  unsigned leve
226e0 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41  l = pgFlags & PA
226f0 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
22700 4d 41 53 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  MASK;.  assert( 
22710 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65  level>=1 && leve
22720 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65 72  l<=3 );.  pPager
22730 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76  ->noSync =  (lev
22740 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
22750 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
22760 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
22770 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20  ync = (level==3 
22780 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
22790 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66  File) ?1:0;.  if
227a0 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
227b0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
227c0 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  syncFlags = 0;. 
227d0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
227e0 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  yncFlags = 0;.  
227f0 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67  }else if( pgFlag
22800 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46 53  s & PAGER_FULLFS
22810 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65  YNC ){.    pPage
22820 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
22830 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
22840 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
22850 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
22860 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
22870 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
22880 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f  gs & PAGER_CKPT_
22890 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20  FULLFSYNC ){.   
228a0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
228b0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
228c0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
228d0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
228e0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
228f0 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _FULL;.  }else{.
22900 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
22910 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22920 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
22930 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
22940 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22950 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  YNC_NORMAL;.  }.
22960 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
22970 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d  cFlags = pPager-
22980 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66  >syncFlags;.  if
22990 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
229a0 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
229b0 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c  ->walSyncFlags |
229c0 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53  = WAL_SYNC_TRANS
229d0 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69  ACTIONS;.  }.  i
229e0 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
229f0 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29 7b  ER_CACHESPILL ){
22a00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
22a10 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c  otSpill &= ~SPIL
22a20 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LFLAG_OFF;.  }el
22a30 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
22a40 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50  doNotSpill |= SP
22a50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d  ILLFLAG_OFF;.  }
22a60 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22a70 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
22a80 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
22a90 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
22aa0 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
22ab0 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
22ac0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
22ad0 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
22ae0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
22af0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
22b00 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
22b10 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
22b20 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
22b30 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
22b40 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
22b50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
22b60 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
22b70 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
22b80 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
22b90 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52  r into *pFile. R
22ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
22bb0 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f  on success .** o
22bc0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
22bd0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
22be0 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
22bf0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
22c00 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  * delete the tem
22c10 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
22c20 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
22c30 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
22c40 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53  assed to the VFS
22c50 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63   layer xOpen() c
22c60 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70  all are those sp
22c70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61  ecified.** by pa
22c80 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73  rameter vfsFlags
22c90 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66   ORed with the f
22ca0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
22cb0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22cc0 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20  READWRITE.**    
22cd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
22ce0 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ATE.**     SQLIT
22cf0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
22d00 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
22d10 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
22d20 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
22d30 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  pagerOpentemp(. 
22d40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
22d50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
22d60 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
22d70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
22d80 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
22d90 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
22da0 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
22db0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
22dc0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
22dd0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
22de0 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
22df0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
22e00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
22e10 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
22e20 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
22e30 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
22e40 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
22e50 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
22e60 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
22e70 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
22e80 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
22e90 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
22ea0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
22eb0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
22ec0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
22ed0 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
22ee0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
22ef0 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
22f00 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
22f10 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
22f20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
22f30 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
22f40 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
22f50 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
22f60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22f70 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
22f80 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
22f90 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
22fa0 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
22fb0 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
22fc0 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
22fd0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
22fe0 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
22ff0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
23000 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
23010 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
23020 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
23030 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
23040 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
23050 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
23060 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
23070 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
23080 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
23090 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
230a0 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
230b0 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
230c0 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
230d0 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
230e0 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
230f0 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
23100 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
23110 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
23120 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23140 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
23150 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
23160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23190 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
231a0 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
231b0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
231c0 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
231d0 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
231e0 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
231f0 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
23200 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
23210 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
23220 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
23230 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
23240 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
23250 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
23260 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
23270 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
23280 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
23290 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
232a0 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
232b0 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
232c0 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
232d0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
232e0 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
232f0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
23300 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
23310 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
23320 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
23330 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
23340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
23350 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
23360 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
23370 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
23380 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
23390 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
233a0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
233b0 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
233c0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
233d0 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
233e0 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
233f0 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50  ndler */.){.  pP
23400 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
23410 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65  er = xBusyHandle
23420 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  r;.  pPager->pBu
23430 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70  syHandlerArg = p
23440 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a  BusyHandlerArg;.
23450 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
23460 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
23470 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f   void **ap = (vo
23480 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78  id **)&pPager->x
23490 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
234a0 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a   assert( ((int(*
234b0 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d  )(void *))(ap[0]
234c0 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72  ))==xBusyHandler
234d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
234e0 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64  ap[1]==pBusyHand
234f0 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71  lerArg );.    sq
23500 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
23510 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
23520 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
23530 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f  BUSYHANDLER, (vo
23540 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a  id *)ap);.  }.}.
23550 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
23560 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64  e page size used
23570 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62   by the Pager ob
23580 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61  ject. The new pa
23590 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70  ge size .** is p
235a0 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53  assed in *pPageS
235b0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
235c0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
235d0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  e error state wh
235e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
235f0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a   is called, it.*
23600 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68  * is a no-op. Th
23610 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
23620 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74   is the error st
23630 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28  ate error code (
23640 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20  i.e. .** one of 
23650 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e  SQLITE_IOERR, an
23660 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78   SQLITE_IOERR_xx
23670 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51  x sub-code or SQ
23680 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a  LITE_FULL)..**.*
23690 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
236a0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
236b0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
236c0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77  *.**   * the new
236d0 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75   page size (valu
236e0 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29  e of *pPageSize)
236f0 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77   is valid (a pow
23700 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77  er .**     of tw
23710 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  o between 512 an
23720 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  d SQLITE_MAX_PAG
23730 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76  E_SIZE, inclusiv
23740 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  e), and.**.**   
23750 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * there are no o
23760 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
23770 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a  references, and.
23780 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  **.**   * the da
23790 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72  tabase is either
237a0 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   not an in-memor
237b0 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74  y database or it
237c0 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   is.**     an in
237d0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
237e0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
237f0 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
23800 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68   pages..**.** th
23810 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  en the pager obj
23820 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ect page size is
23830 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69   set to *pPageSi
23840 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
23850 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68   page size is ch
23860 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73  anged, then this
23870 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73   function uses s
23880 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f  qlite3PagerMallo
23890 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  c() .** to obtai
238a0 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54  n a new Pager.pT
238b0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20  mpSpace buffer. 
238c0 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  If this allocati
238d0 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66  on attempt .** f
238e0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
238f0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
23900 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  nd the page size
23910 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
23920 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f  ed. .** In all o
23930 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49  ther cases, SQLI
23940 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
23950 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
23960 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
23970 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72   changed, either
23980 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20   because one of 
23990 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a  the enumerated.*
239a0 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  * conditions abo
239b0 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20  ve is not true, 
239c0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
239d0 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
239e0 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
239f0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f  on was called, o
23a00 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65  r because the me
23a10 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
23a20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20  attempt failed, 
23a30 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53  .** then *pPageS
23a40 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
23a50 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20  e old, retained 
23a60 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65  page size before
23a70 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
23a80 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
23a90 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
23aa0 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70   *pPager, u32 *p
23ab0 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  PageSize, int nR
23ac0 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
23ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
23ae0 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
23af0 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20  ossible to do a 
23b00 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65  full assert_page
23b10 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20  r_state() here, 
23b20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  as this.  ** fun
23b30 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
23b40 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
23b50 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66  PagerOpen(), bef
23b60 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20  ore the state.  
23b70 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  ** of the Pager 
23b80 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e  object is intern
23b90 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e  ally consistent.
23ba0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e  .  **.  ** At on
23bb0 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e  e point this fun
23bc0 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61  ction returned a
23bd0 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 70  n error if the p
23be0 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  ager was in .  *
23bf0 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  * PAGER_ERROR st
23c00 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50  ate. But since P
23c10 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
23c20 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
23c30 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
23c40 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
23c50 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
23c60 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e  erence, this fun
23c70 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20  ction.  ** is a 
23c80 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63  no-op for that c
23c90 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ase anyhow..  */
23ca0 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a 65  ..  u32 pageSize
23cb0 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
23cc0 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
23cd0 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
23ce0 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
23cf0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
23d00 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69  AGE_SIZE) );.  i
23d10 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( (pPager->memD
23d20 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  b==0 || pPager->
23d30 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26  dbSize==0).   &&
23d40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
23d50 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
23d60 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26  PCache)==0 .   &
23d70 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  & pageSize && pa
23d80 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61  geSize!=(u32)pPa
23d90 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
23da0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e   ){.    char *pN
23db0 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ew = NULL;      
23dc0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65         /* New te
23dd0 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  mp space */.    
23de0 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a  i64 nByte = 0;..
23df0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23e00 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45  eState>PAGER_OPE
23e10 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  N && isOpen(pPag
23e20 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
23e30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
23e40 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
23e50 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  fd, &nByte);.   
23e60 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
23e70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23e80 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a    pNew = (char *
23e90 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c  )sqlite3PageMall
23ea0 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  oc(pageSize);.  
23eb0 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20      if( !pNew ) 
23ec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
23ed0 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  M;.    }..    if
23ee0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23ef0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
23f00 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
23f10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23f20 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
23f30 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
23f40 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
23f50 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
23f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23f70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
23f80 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
23f90 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
23fa0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
23fb0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61   pNew;.      pPa
23fc0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
23fd0 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65  gno)((nByte+page
23fe0 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65  Size-1)/pageSize
23ff0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
24000 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
24010 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
24020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
24030 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  geFree(pNew);.  
24040 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
24050 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
24060 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
24070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24080 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
24090 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
240a0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
240b0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
240c0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
240d0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
240e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
240f0 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
24100 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
24110 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
24120 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61  ;.    pagerFixMa
24130 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
24140 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24160 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24170 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
24180 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
24190 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
241a0 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
241b0 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
241c0 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
241d0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
241e0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
241f0 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
24200 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
24210 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
24220 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
24230 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
24240 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
24250 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
24260 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
24270 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
24280 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
24290 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
242a0 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
242b0 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
242c0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
242d0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
242e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
242f0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
24300 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
24310 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
24320 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
24330 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
24340 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
24350 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
24360 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
24370 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
24380 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
24390 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
243a0 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
243b0 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
243c0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
243d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
243e0 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
243f0 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
24400 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
24410 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
24420 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
24430 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
24440 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
24450 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
24460 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
24470 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
24480 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
24490 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
244a0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
244b0 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20  GER_OPEN );     
244c0 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20   /* Called only 
244d0 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a  by OP_MaxPgcnt *
244e0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
244f0 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
24500 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f  er->dbSize );  /
24510 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e  * OP_MaxPgcnt en
24520 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20  forces this */. 
24530 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
24540 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
24550 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
24560 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
24570 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
24580 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
24590 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
245a0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
245b0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
245c0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
245d0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
245e0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
245f0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
24600 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
24610 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
24620 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
24630 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
24640 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
24650 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
24660 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
24670 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
24680 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
24690 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
246a0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
246b0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
246c0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
246d0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
246e0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
246f0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
24700 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
24710 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24720 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
24730 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
24740 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
24750 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
24760 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
24770 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
24780 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
24790 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
247a0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
247b0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
247c0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
247d0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
247e0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
247f0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
24800 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
24810 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
24820 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
24830 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
24840 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
24850 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
24860 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
24870 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
24880 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
24890 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
248a0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
248b0 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
248c0 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
248d0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
248e0 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
248f0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
24900 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
24910 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
24920 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
24930 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
24940 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
24950 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
24960 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
24970 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
24980 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
24990 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
249a0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
249b0 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
249c0 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
249d0 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
249e0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
249f0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
24a00 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
24a10 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
24a20 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
24a30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
24a40 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
24a50 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
24a60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24a70 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
24a80 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
24a90 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
24aa0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
24ab0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24ac0 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
24ad0 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
24ae0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
24af0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
24b00 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
24b10 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
24b20 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
24b30 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
24b40 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
24b50 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
24b60 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
24b70 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
24b80 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
24b90 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
24ba0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
24bb0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
24bc0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
24bd0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
24be0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
24bf0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
24c00 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
24c10 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
24c20 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
24c30 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
24c40 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
24c50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
24c60 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
24c70 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
24c80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
24c90 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
24ca0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24cb0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24cc0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
24cd0 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
24ce0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
24cf0 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
24d00 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
24d10 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
24d20 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
24d30 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
24d40 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
24d50 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
24d60 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
24d70 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
24d80 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
24d90 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
24da0 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
24db0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
24dc0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
24dd0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
24de0 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
24df0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24e00 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
24e10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
24e20 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
24e30 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
24e40 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
24e50 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
24e60 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
24e70 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
24e80 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
24e90 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
24ea0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
24eb0 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
24ec0 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
24ed0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
24ee0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
24ef0 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
24f00 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
24f10 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
24f20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
24f30 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
24f40 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
24f50 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
24f60 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
24f70 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
24f80 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
24f90 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
24fa0 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
24fb0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
24fc0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
24fd0 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
24fe0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
24ff0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
25000 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
25010 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
25020 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
25030 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
25040 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
25050 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
25060 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
25070 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
25080 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
25090 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
250a0 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
250b0 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
250c0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
250d0 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
250e0 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
250f0 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
25100 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25130 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
25140 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
25150 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
25160 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
25170 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
25180 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
25190 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20  y held), or one 
251a0 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
251b0 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
251c0 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
251d0 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
251e0 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
251f0 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
25200 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
25210 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
25220 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
25230 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
25240 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
25250 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
25260 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
25270 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
25280 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
25290 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
252a0 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
252b0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
252c0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
252d0 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
252e0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
252f0 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
25300 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
25310 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
25320 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
25330 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
25340 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
25350 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
25360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
25370 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
25380 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
25390 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
253a0 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
253b0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
253c0 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
253d0 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
253e0 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
253f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
25400 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
25410 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
25420 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
25430 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
25440 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
25450 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
25460 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
25470 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
25480 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
25490 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
254a0 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
254b0 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
254c0 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
254d0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
254e0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
254f0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
25500 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
25510 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
25520 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
25530 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
25540 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
25550 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
25560 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
25570 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
25580 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
25590 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
255a0 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
255b0 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
255c0 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
255d0 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
255e0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
255f0 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
25600 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
25610 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
25620 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
25630 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
25640 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
25650 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
25660 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
25670 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
25680 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
25690 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
256a0 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
256b0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
256c0 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
256d0 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
256e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
256f0 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
25700 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
25710 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
25720 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
25730 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
25740 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
25750 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
25760 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
25770 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
25780 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
25790 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
257a0 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
257b0 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
257c0 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
257d0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
257e0 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
257f0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
25800 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25810 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
25820 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
25830 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
25840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
25850 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
25860 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
25870 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
25880 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
25890 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
258a0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
258b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
258c0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
258d0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
258e0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
258f0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25900 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
25910 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
25920 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25930 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
25940 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
25950 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
25960 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
25970 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
25980 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
25990 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
259a0 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
259b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
259c0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
259d0 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
259e0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
259f0 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
25a00 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
25a10 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
25a20 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
25a30 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
25a40 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
25a50 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  itted..**.** Thi
25a60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
25a70 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ly called right 
25a80 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
25a90 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
25aa0 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75  .** Once this fu
25ab0 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
25ac0 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e  called, the tran
25ad0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74  saction must eit
25ae0 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64  her be.** rolled
25af0 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74   back or committ
25b00 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61  ed. It is not sa
25b10 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  fe to call this 
25b20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  function and.** 
25b30 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72  then continue wr
25b40 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
25b50 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  abase..*/.void s
25b60 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
25b70 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
25b80 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
25b90 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
25ba0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
25bb0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
25bc0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25bd0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
25be0 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61  ACHEMOD );.  pPa
25bf0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
25c00 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e  age;..  /* At on
25c10 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65  e point the code
25c20 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73   here called ass
25c30 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25c40 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20  raint() to.  ** 
25c50 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  ensure that all 
25c60 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e  pages being trun
25c70 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68  cated away by th
25c80 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65  is operation are
25c90 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72  ,.  ** if one or
25ca0 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
25cb0 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65   are open, prese
25cc0 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f  nt in the savepo
25cd0 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  int .  ** journa
25ce0 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  l so that they c
25cf0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
25d00 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
25d10 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62  is rolled.  ** b
25d20 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20  ack. This is no 
25d30 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79  longer necessary
25d40 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
25d50 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20  n is now only.  
25d60 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ** called right 
25d70 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
25d80 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
25d90 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65   So although the
25da0 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a   .  ** Pager obj
25db0 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61  ect may still ha
25dc0 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ve open savepoin
25dd0 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  ts (Pager.nSavep
25de0 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20  oint!=0), .  ** 
25df0 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72  they cannot be r
25e00 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74  olled back. So t
25e10 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  he assertTruncat
25e20 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61  eConstraint() ca
25e30 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f  ll.  ** is no lo
25e40 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f  nger correct. */
25e50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
25e60 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
25e70 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
25e80 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
25e90 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
25ea0 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
25eb0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
25ec0 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
25ed0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
25ee0 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
25ef0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
25f00 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
25f10 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
25f20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
25f30 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
25f40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
25f50 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
25f60 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
25f70 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
25f80 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
25f90 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
25fa0 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
25fb0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
25fc0 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
25fd0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
25fe0 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
25ff0 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
26000 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
26010 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
26020 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
26030 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
26040 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
26050 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
26060 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
26070 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
26080 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26090 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
260a0 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
260b0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
260c0 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
260d0 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
260e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
260f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26100 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
26110 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
26120 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
26130 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
26140 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
26150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
26160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
26180 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
26190 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
261a0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
261b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
261c0 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65  *.** Obtain a re
261d0 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d  ference to a mem
261e0 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
261f0 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20  object for page 
26200 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a  number pgno. .**
26210 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
26220 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69  will use the poi
26230 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61  nter pData, obta
26240 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68  ined from xFetch
26250 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  ()..** If succes
26260 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67  sful, set *ppPag
26270 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
26280 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72  e new page refer
26290 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75  ence.** and retu
262a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
262b0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
262c0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
262d0 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20  code and set.** 
262e0 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e  *ppPage to zero.
262f0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65  .**.** Page refe
26300 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20  rences obtained 
26310 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
26320 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
26330 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62  be released.** b
26340 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52  y calling pagerR
26350 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e  eleaseMapPage().
26360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26370 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
26380 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
26390 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
263a0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
263b0 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  bject */.  Pgno 
263c0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
263d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
263e0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76  ge number */.  v
263f0 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20  oid *pData,     
26400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26410 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74  * xFetch()'d dat
26420 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  a for this page 
26430 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  */.  PgHdr **ppP
26440 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20  age             
26450 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71       /* OUT: Acq
26460 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63  uired page objec
26470 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  t */.){.  PgHdr 
26480 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
26490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
264a0 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
264b0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20  to return */..  
264c0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  if( pPager->pMma
264d0 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20  pFreelist ){.   
264e0 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70   *ppPage = p = p
264f0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26500 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  list;.    pPager
26510 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
26520 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
26530 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a   p->pDirty = 0;.
26540 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45      memset(p->pE
26550 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  xtra, 0, pPager-
26560 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73  >nExtra);.  }els
26570 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
26580 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71   p = (PgHdr *)sq
26590 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
265a0 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20  sizeof(PgHdr) + 
265b0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
265c0 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  .    if( p==0 ){
265d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
265e0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
265f0 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31  fd, (i64)(pgno-1
26600 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) * pPager->page
26610 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
26620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26630 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
26640 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28     p->pExtra = (
26650 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20  void *)&p[1];.  
26660 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48    p->flags = PGH
26670 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e  DR_MMAP;.    p->
26680 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d  nRef = 1;.    p-
26690 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
266a0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
266b0 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69   p->pExtra==(voi
266c0 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61  d *)&p[1] );.  a
266d0 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 3d  ssert( p->pPage=
266e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
266f0 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f  p->flags==PGHDR_
26700 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65 72 74  MMAP );.  assert
26710 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ( p->pPager==pPa
26720 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
26730 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a   p->nRef==1 );..
26740 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f    p->pgno = pgno
26750 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 70  ;.  p->pData = p
26760 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Data;.  pPager->
26770 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72  nMmapOut++;..  r
26780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
267a0 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
267b0 20 70 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d   page pPg. pPg m
267c0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  ust have been re
267d0 74 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a  turned by an .**
267e0 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
267f0 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
26800 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
26810 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65  c void pagerRele
26820 61 73 65 4d 61 70 50 61 67 65 28 50 67 48 64 72  aseMapPage(PgHdr
26830 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
26840 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
26850 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  Pager;.  pPager-
26860 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70  >nMmapOut--;.  p
26870 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61  Pg->pDirty = pPa
26880 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26890 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d  st;.  pPager->pM
268a0 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50  mapFreelist = pP
268b0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  g;..  assert( pP
268c0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
268d0 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20  ds->iVersion>=3 
268e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  );.  sqlite3OsUn
268f0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
26900 2c 20 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e  , (i64)(pPg->pgn
26910 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67  o-1)*pPager->pag
26920 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74  eSize, pPg->pDat
26930 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  a);.}../*.** Fre
26940 65 20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65  e all PgHdr obje
26950 63 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  cts stored in th
26960 65 20 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65  e Pager.pMmapFre
26970 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73  elist list..*/.s
26980 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
26990 46 72 65 65 4d 61 70 48 64 72 73 28 50 61 67 65  FreeMapHdrs(Page
269a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
269b0 48 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20  Hdr *p;.  PgHdr 
269c0 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d  *pNext;.  for(p=
269d0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
269e0 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78  elist; p; p=pNex
269f0 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
26a00 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73  p->pDirty;.    s
26a10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
26a20 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68    }.}.../*.** Sh
26a30 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
26a40 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
26a50 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
26a60 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
26a70 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
26a80 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
26a90 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
26aa0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
26ab0 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
26ac0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
26ad0 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
26ae0 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
26af0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
26b00 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
26b10 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
26b20 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
26b30 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
26b40 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
26b50 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
26b60 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
26b70 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
26b80 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
26b90 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
26ba0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
26bb0 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
26bc0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
26bd0 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
26be0 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
26bf0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
26c00 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
26c10 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
26c20 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
26c30 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
26c40 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
26c50 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
26c60 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
26c70 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
26c80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26c90 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
26ca0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20   *pPager){.  u8 
26cb0 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
26cc0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
26cd0 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ..  assert( asse
26ce0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
26cf0 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61  Pager) );.  disa
26d00 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
26d10 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
26d20 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
26d30 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72  alloc();.  pager
26d40 46 72 65 65 4d 61 70 48 64 72 73 28 70 50 61 67  FreeMapHdrs(pPag
26d50 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  er);.  /* pPager
26d60 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a  ->errCode = 0; *
26d70 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  /.  pPager->excl
26d80 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23  usiveMode = 0;.#
26d90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26da0 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33  IT_WAL.  sqlite3
26db0 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  WalClose(pPager-
26dc0 3e 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63  >pWal, pPager->c
26dd0 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50  kptSyncFlags, pP
26de0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
26df0 70 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d  pTmp);.  pPager-
26e00 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  >pWal = 0;.#endi
26e10 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  f.  pager_reset(
26e20 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d  pPager);.  if( M
26e30 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65  EMDB ){.    page
26e40 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
26e50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
26e60 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c  * If it is open,
26e70 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
26e80 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  l file before ca
26e90 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52  lling UnlockAndR
26ea0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20  ollback..    ** 
26eb0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64  If this is not d
26ec0 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73  one, then an uns
26ed0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
26ee0 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
26ef0 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d  l .    ** file m
26f00 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  ay be played bac
26f10 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
26f20 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20  ase. If a power 
26f30 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a  failure occurs .
26f40 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69      ** while thi
26f50 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
26f60 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
26f70 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
26f80 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
26f90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
26fa0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
26fb0 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75   to sync the jou
26fc0 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20  rnal, shift the 
26fd0 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74  pager.    ** int
26fe0 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
26ff0 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55  e. This causes U
27000 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
27010 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20   to unlock the. 
27020 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
27030 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  nd close the jou
27040 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75  rnal file withou
27050 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  t attempting to 
27060 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62  roll it.    ** b
27070 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20  ack or finalize 
27080 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74  it. The next dat
27090 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20  abase user will 
270a0 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a  have to do hot-j
270b0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f  ournal.    ** ro
270c0 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63  llback before ac
270d0 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61  cessing the data
270e0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
270f0 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  /.    if( isOpen
27100 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
27110 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
27120 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72  or(pPager, pager
27130 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
27140 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
27150 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
27160 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
27170 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
27180 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
27190 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
271a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
271b0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
271c0 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
271d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
271e0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
271f0 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
27200 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
27210 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
27220 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  );.  sqlite3OsCl
27230 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
27240 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
27250 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69  ee(pTmp);.  sqli
27260 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70  te3PcacheClose(p
27270 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
27280 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
27290 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
272a0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
272b0 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f  ee ) pPager->xCo
272c0 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e  decFree(pPager->
272d0 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a  pCodec);.#endif.
272e0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
272f0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26  er->aSavepoint &
27300 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  & !pPager->pInJo
27310 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
27320 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
27330 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70  r->jfd) && !isOp
27340 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
27350 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   );..  sqlite3_f
27360 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
27370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27380 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
27390 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
273a0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
273b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
273c0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
273d0 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50  r page pPg..*/.P
273e0 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
273f0 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
27400 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
27410 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23  n pPg->pgno;.}.#
27420 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
27430 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
27440 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
27450 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64  age pPg..*/.void
27460 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
27470 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
27480 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
27490 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f(pPg);.}../*.**
274a0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
274b0 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
274c0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
274d0 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
274e0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
274f0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
27500 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
27510 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
27520 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
27530 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20  disk and can be 
27540 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  restored in the 
27550 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a  event of a hot-j
27560 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
27570 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61  .**.** If the Pa
27580 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20  ger.noSync flag 
27590 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  is set, then thi
275a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
275b0 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77  no-op..** Otherw
275c0 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73  ise, the actions
275d0 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64   required depend
275e0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   on the journal-
275f0 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a  mode and the .**
27600 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
27610 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 66  ristics of the f
27620 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
27630 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
27640 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
27650 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
27660 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
27670 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
27680 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
27690 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
276a0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
276b0 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
276c0 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
276d0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
276e0 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
276f0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
27700 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
27710 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
27720 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
27730 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
27740 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
27750 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
27760 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
27770 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
27780 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
27790 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
277a0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
277b0 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
277c0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
277d0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
277e0 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
277f0 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
27800 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
27810 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
27820 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
27830 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
27840 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
27850 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27860 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
27870 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
27880 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
27890 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
278a0 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
278b0 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
278c0 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
278d0 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
278e0 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
278f0 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
27900 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
27910 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
27920 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
27930 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
27940 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
27950 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
27960 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
27970 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ful, this routin
27980 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48  e clears the PGH
27990 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
279a0 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70  g of every .** p
279b0 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65  age currently he
279c0 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66  ld in memory bef
279d0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
279e0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
279f0 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e  O.** error is en
27a00 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
27a10 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
27a20 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
27a30 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
27a40 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
27a50 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
27a60 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72  ager, int newHdr
27a70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
27aa0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
27ab0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
27ac0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
27ad0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
27ae0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
27af0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
27b00 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
27b10 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
27b20 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
27b30 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
27b40 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
27b50 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
27b60 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
27b70 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  eLock(pPager);. 
27b80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27b90 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
27ba0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
27bb0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
27bc0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
27bd0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
27be0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
27bf0 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
27c00 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
27c10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
27c20 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
27c30 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
27c40 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
27c50 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
27c60 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
27c70 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
27c80 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
27c90 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
27ca0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
27cb0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
27cc0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
27cd0 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
27ce0 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
27cf0 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
27d00 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
27d10 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
27d20 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
27d30 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
27d40 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
27d50 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
27d60 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
27d70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27d80 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
27d90 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
27da0 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
27db0 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
27dc0 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
27dd0 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
27de0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
27df0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
27e00 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
27e10 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
27e20 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
27e30 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
27e40 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
27e50 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f  ion's transactio
27e60 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
27e70 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
27e80 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
27e90 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
27ea0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
27eb0 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
27ec0 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
27ed0 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
27ee0 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
27ef0 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
27f00 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
27f10 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
27f20 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
27f30 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
27f40 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
27f50 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
27f60 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
27f70 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
27f80 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
27f90 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
27fa0 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
27fb0 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
27fc0 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
27fd0 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
27fe0 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
27ff0 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
28000 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
28010 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
28020 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
28030 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
28040 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
28050 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
28060 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
28070 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
28080 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
28090 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
280a0 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
280b0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
280c0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
280d0 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
280e0 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
280f0 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
28100 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
28110 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
28120 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
28130 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
28140 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
28150 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
28160 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
28170 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
28180 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
28190 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
281a0 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
281b0 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
281c0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
281d0 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
281e0 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
281f0 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
28200 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
28210 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
28220 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
28230 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
28240 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  xtHdrOffset;.   
28250 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
28260 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48  ];.        u8 zH
28270 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
28280 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a  urnalMagic)+4];.
28290 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
282a0 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
282b0 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
282c0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
282d0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
282e0 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
282f0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
28300 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
28310 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
28320 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
28330 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
28340 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
28350 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
28360 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
28370 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
28380 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
28390 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
283a0 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
283b0 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
283c0 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
283d0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
283e0 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
283f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
28400 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
28410 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
28420 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
28430 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
28440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28450 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28460 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
28470 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
28480 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
28490 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
284a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
284b0 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
284c0 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
284d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
284e0 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
284f0 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
28500 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
28510 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
28520 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
28530 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
28540 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
28550 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
28560 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
28570 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
28580 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
28590 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
285a0 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
285b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
285c0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
285d0 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
285e0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
285f0 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
28600 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
28610 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
28620 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
28630 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
28640 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
28650 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
28660 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
28670 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
28680 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
28690 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
286a0 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
286b0 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
286c0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
286d0 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
286e0 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
286f0 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
28700 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
28710 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
28720 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
28730 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
28740 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
28750 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
28760 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
28770 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
28780 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
28790 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
287a0 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
287b0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
287c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
287d0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
287e0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
287f0 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
28800 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28810 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28820 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
28830 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
28840 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20  HDR %p %lld\n", 
28850 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
28860 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20  journalHdr));.  
28870 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28880 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20  e3OsWrite(.     
28890 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
288a0 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
288b0 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50  eof(zHeader), pP
288c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
288d0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
288e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
288f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28900 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
28910 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
28920 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
28930 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
28940 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
28950 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
28960 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
28970 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
28980 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
28990 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
289a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
289b0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
289c0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
289d0 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20  syncFlags| .    
289e0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
289f0 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45  yncFlags==SQLITE
28a00 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
28a10 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
28a20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
28a30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28a40 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
28a50 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
28a60 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
28a70 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
28a80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
28a90 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26     if( newHdr &&
28aa0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
28ab0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
28ac0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  D) ){.        pP
28ad0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
28ae0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
28af0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
28b00 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
28b10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28b20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
28b30 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
28b40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
28b50 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
28b60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
28b70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
28b80 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
28b90 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64  is in noSync mod
28ba0 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
28bb0 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20  ile was just .  
28bc0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
28bd0 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77  synced. Either w
28be0 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ay, clear the PG
28bf0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
28c00 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20  ag on .  ** all 
28c10 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  pages..  */.  sq
28c20 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
28c30 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
28c40 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50  ->pPCache);.  pP
28c50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
28c60 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
28c70 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  D;.  assert( ass
28c80 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
28c90 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
28ca0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28cb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
28cc0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
28cd0 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
28ce0 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
28cf0 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
28d00 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
28d10 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
28d20 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
28d30 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
28d40 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
28d50 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
28d60 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
28d70 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
28d80 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
28d90 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
28da0 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
28db0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
28dc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
28dd0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
28de0 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
28df0 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
28e00 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
28e10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
28e20 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
28e30 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
28e40 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
28e50 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
28e60 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
28e70 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
28e80 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
28e90 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
28ea0 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
28eb0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
28ec0 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
28ed0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
28ee0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28ef0 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
28f00 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
28f10 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
28f20 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
28f30 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
28f40 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
28f50 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
28f60 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
28f70 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
28f80 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
28f90 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
28fa0 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
28fb0 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
28fc0 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
28fd0 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
28fe0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
28ff0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
29000 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
29010 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
29020 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
29030 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
29040 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
29050 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
29060 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
29070 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
29080 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
29090 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
290a0 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
290b0 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
290c0 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
290d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
290e0 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
290f0 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
29100 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
29110 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
29120 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
29130 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
29140 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
29150 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
29160 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
29170 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
29180 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
29190 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
291a0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
291b0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
291c0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
291d0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
291e0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
291f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
29200 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
29210 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
29220 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
29230 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
29240 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
29250 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
29260 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
29270 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
29280 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
29290 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
292a0 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50  gelist(Pager *pP
292b0 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69  ager, PgHdr *pLi
292c0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
292d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
292e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
292f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
29300 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
29310 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
29320 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61   for rollback pa
29330 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44  gers in WRITER_D
29340 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  BMOD state. */. 
29350 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
29360 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
29370 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29380 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
29390 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b  _WRITER_DBMOD );
293a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
293b0 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
293c0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
293d0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
293e0 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73   a temp-file has
293f0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
29400 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
29410 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f  w. It.  ** is no
29420 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  t possible for r
29430 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68  c to be other th
29440 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  an SQLITE_OK if 
29450 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
29460 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61   is taken, as pa
29470 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
29480 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
29490 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20  r temp-files..  
294a0 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
294b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
294c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
294d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
294e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
294f0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
29500 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
29510 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
29520 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
29530 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
29540 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c  the first write,
29550 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20   give the VFS a 
29560 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65  hint of what the
29570 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65   final.  ** file
29580 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20   size will be.. 
29590 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63   */.  assert( rc
295a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
295b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
295c0 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ) );.  if( rc==S
295d0 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
295e0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
295f0 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
29600 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e  e.   && (pList->
29610 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d  pDirty || pList-
29620 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
29630 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20  HintSize).  ){. 
29640 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
29650 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72   szFile = pPager
29660 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71  ->pageSize * (sq
29670 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67  lite3_int64)pPag
29680 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
29690 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
296a0 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
296b0 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
296c0 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a  L_SIZE_HINT, &sz
296d0 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65  File);.    pPage
296e0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
296f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
29700 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63    }..  while( rc
29710 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
29720 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  List ){.    Pgno
29730 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70   pgno = pList->p
29740 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  gno;..    /* If 
29750 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
29760 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
29770 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
29780 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
29790 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
297a0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
297b0 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
297c0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
297d0 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
297e0 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
297f0 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
29800 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
29810 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
29820 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
29830 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
29840 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
29850 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
29860 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  so, do not write
29870 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68   out any page th
29880 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52  at has the PGHDR
29890 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
298a0 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74  .    ** set (set
298b0 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
298c0 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20  DontWrite())..  
298d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
298e0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
298f0 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e  e && 0==(pList->
29900 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54  flags&PGHDR_DONT
29910 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
29920 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
29930 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
29940 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
29950 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69  /* Offset to wri
29960 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  te */.      char
29970 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
299a0 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20  ta to write */  
299b0 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74    ..      assert
299c0 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ( (pList->flags&
299d0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
299e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
299f0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
29a00 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  ) pager_write_ch
29a10 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73  angecounter(pLis
29a20 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  t);..      /* En
29a30 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
29a40 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43  e */.      CODEC
29a50 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
29a60 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c  >pData, pgno, 6,
29a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
29a80 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20  OMEM, pData);.. 
29a90 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75       /* Write ou
29aa0 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  t the page data.
29ab0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
29ac0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
29ad0 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
29ae0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
29af0 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  e, offset);..   
29b00 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20     /* If page 1 
29b10 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  was just written
29b20 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64  , update Pager.d
29b30 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74  bFileVers to mat
29b40 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ch.      ** the 
29b50 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64  value now stored
29b60 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
29b70 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e   file. If writin
29b80 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  g this .      **
29b90 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65   page caused the
29ba0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
29bb0 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64  o grow, update d
29bc0 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20  bFileSize. .    
29bd0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
29be0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
29bf0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
29c00 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
29c10 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
29c20 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
29c30 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
29c40 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
29c50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
29c60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
29c70 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
29c80 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20   pgno;.      }. 
29c90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
29ca0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
29cb0 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  ITE]++;..      /
29cc0 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63  * Update any bac
29cd0 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79  kup objects copy
29ce0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
29cf0 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20   of this pager. 
29d00 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
29d10 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
29d20 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
29d30 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e  no, (u8*)pList->
29d40 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50  pData);..      P
29d50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
29d60 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
29d70 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
29d90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
29da0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
29db0 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
29dc0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
29dd0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
29de0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
29df0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
29e00 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
29e10 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
29e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
29e30 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
29e40 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
29e50 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29e60 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
29e70 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
29e80 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
29e90 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
29ea0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
29eb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29ec0 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68  ./*.** Ensure th
29ed0 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  at the sub-journ
29ee0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  al file is open.
29ef0 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
29f00 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a  y open, this .**
29f10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
29f20 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
29f30 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
29f40 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
29f50 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
29f60 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53  o plan. An .** S
29f70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
29f80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29f90 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
29fa0 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
29fb0 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  n() .** fails..*
29fc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
29fd0 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
29fe0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
29ff0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a000 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
2a010 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
2a020 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2a030 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2a040 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2a050 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
2a060 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
2a070 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
2a080 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
2a090 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20  ager->sjfd);.   
2a0a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2a0b0 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
2a0c0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
2a0d0 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >sjfd, SQLITE_OP
2a0e0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
2a0f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2a100 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a110 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
2a120 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
2a130 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
2a140 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
2a150 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74  nal. .** It is t
2a160 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
2a170 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65  nsibility to use
2a180 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2a190 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a  e() to check .**
2a1a0 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c   that it is real
2a1b0 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ly required befo
2a1c0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
2a1d0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2a1e0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2a1f0 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
2a200 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
2a210 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
2a220 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
2a230 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
2a240 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2a250 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2a260 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
2a270 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
2a280 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
2a290 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
2a2a0 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
2a2b0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
2a2c0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
2a2d0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
2a2e0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
2a2f0 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
2a300 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
2a310 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
2a320 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
2a330 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
2a340 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
2a350 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
2a360 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2a370 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2a380 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2a390 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
2a3a0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
2a3b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
2a3c0 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  {..    /* Open t
2a3d0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
2a3e0 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
2a3f0 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
2a400 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  d */.    assert(
2a410 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2a420 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
2a430 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2a440 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55  ->jfd) || pagerU
2a450 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
2a460 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
2a470 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2a480 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75  ) || pPager->nSu
2a490 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  bRec==0 );.    a
2a4a0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
2a4b0 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  al(pPager) .    
2a4c0 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f       || pageInJo
2a4d0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50  urnal(pPager, pP
2a4e0 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  g) .         || 
2a4f0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
2a500 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
2a510 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70    );.    rc = op
2a520 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
2a530 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
2a540 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2a550 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63   was opened succ
2a560 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73  essfully (or was
2a570 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a   already open),.
2a580 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65      ** write the
2a590 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
2a5a0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
2a5b0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2a5c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a5d0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
2a5e0 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
2a5f0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
2a600 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62  i64)pPager->nSub
2a610 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
2a620 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
2a630 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20  char *pData2;.  
2a640 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
2a650 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
2a660 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
2a670 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
2a680 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50  pData2);.      P
2a690 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54  AGERTRACE(("STMT
2a6a0 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
2a6b0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2a6c0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2a6d0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  no));.      rc =
2a6e0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
2a6f0 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65  ger->sjfd, offse
2a700 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
2a710 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2a720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2a740 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  Write(pPager->sj
2a750 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
2a760 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
2a770 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d  fset+4);.      }
2a780 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2a790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a7a0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  {.    pPager->nS
2a7b0 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  ubRec++;.    ass
2a7c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
2a7d0 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
2a7e0 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
2a7f0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
2a800 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
2a810 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2a830 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2a840 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
2a850 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
2a860 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
2a870 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
2a880 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
2a890 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
2a8a0 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
2a8b0 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
2a8c0 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
2a8d0 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
2a8e0 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
2a8f0 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
2a900 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
2a910 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2a920 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
2a930 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
2a940 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
2a950 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
2a960 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2a970 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
2a980 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
2a990 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2a9a0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
2a9b0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
2a9c0 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
2a9d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
2a9e0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2a9f0 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
2aa00 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
2aa10 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
2aa20 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2aa30 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
2aa40 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
2aa50 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
2aa60 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2aa70 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
2aa80 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
2aa90 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2aaa0 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
2aab0 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
2aac0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
2aad0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2aae0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2aaf0 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
2ab00 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
2ab10 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
2ab20 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2ab30 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
2ab40 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
2ab50 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
2ab60 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
2ab70 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
2ab80 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2ab90 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
2aba0 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
2abb0 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
2abc0 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
2abd0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
2abe0 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
2abf0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
2ac00 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
2ac10 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
2ac20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ac30 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2ac40 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
2ac50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
2ac60 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2ac70 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
2ac80 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e  doNotSpill NOSYN
2ac90 43 20 62 69 74 20 69 73 20 73 65 74 20 64 75 72  C bit is set dur
2aca0 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
2acb0 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
2acc0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
2acd0 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
2ace0 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
2acf0 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
2ad00 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
2ad10 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
2ad20 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
2ad30 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
2ad40 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
2ad50 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
2ad60 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
2ad70 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
2ad80 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52  The doNotSpill R
2ad90 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20  OLLBACK and OFF 
2ada0 62 69 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c  bits inhibits al
2adb0 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67  l cache spilling
2adc0 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73  .  ** regardless
2add0 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
2ade0 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71  ot a sync is req
2adf0 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  uired.  This is 
2ae00 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  set during.  ** 
2ae10 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79  a rollback or by
2ae20 20 75 73 65 72 20 72 65 71 75 65 73 74 2c 20 72   user request, r
2ae30 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a  espectively..  *
2ae40 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20  *.  ** Spilling 
2ae50 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74  is also prohibit
2ae60 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72  ed when in an er
2ae70 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20  ror state since 
2ae80 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20  that could.  ** 
2ae90 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
2aea0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49   corruption.   I
2aeb0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
2aec0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20  plementation it 
2aed0 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69  .  ** is impossi
2aee0 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50  ble for sqlite3P
2aef0 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20  cacheFetch() to 
2af00 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63  be called with c
2af10 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a  reateFlag==3.  *
2af20 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65  * while in the e
2af30 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63  rror state, henc
2af40 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62  e it is impossib
2af50 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
2af60 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63  ine to.  ** be c
2af70 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72  alled in the err
2af80 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72  or state.  Never
2af90 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c  theless, we incl
2afa0 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20  ude a NEVER().  
2afb0 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20  ** test for the 
2afc0 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61  error state as a
2afd0 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e   safeguard again
2afe0 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65  st future change
2aff0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45  s..  */.  if( NE
2b000 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
2b010 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51  ode) ) return SQ
2b020 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63  LITE_OK;.  testc
2b030 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2b040 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2b050 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  LAG_ROLLBACK );.
2b060 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2b070 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2b080 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29   SPILLFLAG_OFF )
2b090 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2b0a0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2b0b0 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53   & SPILLFLAG_NOS
2b0c0 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61  YNC );.  if( pPa
2b0d0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a  ger->doNotSpill.
2b0e0 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e     && ((pPager->
2b0f0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50  doNotSpill & (SP
2b100 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2b110 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29  |SPILLFLAG_OFF))
2b120 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  !=0.      || (pP
2b130 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
2b140 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a  _NEED_SYNC)!=0).
2b150 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2b160 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2b170 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
2b180 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  0;.  if( pagerUs
2b190 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
2b1a0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
2b1b0 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
2b1c0 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
2b1d0 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28   log. */.    if(
2b1e0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2b1f0 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20  e(pPg) ){ .     
2b200 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
2b210 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20  Page(pPg); .    
2b220 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2b230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b240 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
2b250 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
2b260 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
2b270 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f   }else{.  .    /
2b280 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
2b290 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69  al file if requi
2b2a0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
2b2b0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2b2c0 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20  _NEED_SYNC .    
2b2d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2b2e0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
2b2f0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b  _CACHEMOD.    ){
2b300 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
2b310 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2b320 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  1);.    }.  .   
2b330 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
2b340 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70  number of this p
2b350 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  age is larger th
2b360 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  an the current s
2b370 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ize of.    ** th
2b380 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
2b390 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f  , it may need to
2b3a0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
2b3b0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
2b3c0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
2b3d0 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
2b3e0 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  to pager_write_p
2b3f0 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20  agelist() below 
2b400 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  will not.    ** 
2b410 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64  actually write d
2b420 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20  ata to the file 
2b430 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
2b440 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73    **.    ** Cons
2b450 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
2b460 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65  ng sequence of e
2b470 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  vents:.    **.  
2b480 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20    **   BEGIN;.  
2b490 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61    **     <journa
2b4a0 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a  l page X>.    **
2b4b0 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67       <modify pag
2b4c0 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X>.    **     
2b4d0 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20  SAVEPOINT sp;.  
2b4e0 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69    **       <shri
2b4f0 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  nk database file
2b500 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20   to Y pages>.   
2b510 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53   **       pagerS
2b520 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20  tress(page X).  
2b530 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
2b540 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a  K TO sp;.    **.
2b550 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c      ** If (X>Y),
2b560 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72   then when pager
2b570 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64  Stress is called
2b580 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74   page X will not
2b590 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20   be written.    
2b5a0 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
2b5b0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74  tabase file, but
2b5c0 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64   will be dropped
2b5d0 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e   from the cache.
2b5e0 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f   Then,.    ** fo
2b5f0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c  llowing the "ROL
2b600 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61  LBACK TO sp" sta
2b610 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20  tement, reading 
2b620 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64  page X will read
2b630 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  .    ** data fro
2b640 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
2b650 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62  ile. This will b
2b660 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61  e the copy of pa
2b670 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a  ge X as it.    *
2b680 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74  * was when the t
2b690 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
2b6a0 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61  ed, not as it wa
2b6b0 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e  s when "SAVEPOIN
2b6c0 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73  T sp".    ** was
2b6d0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a   executed..    *
2b6e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
2b6f0 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74  ution is to writ
2b700 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  e the current da
2b710 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e  ta for page X in
2b720 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  to the .    ** s
2b730 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2b740 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f  now (if it is no
2b750 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 29  t already there)
2b760 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  , so that it wil
2b770 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74  l.    ** be rest
2b780 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72 72  ored to its curr
2b790 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74  ent value when t
2b7a0 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
2b7b0 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65  sp" is .    ** e
2b7c0 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  xecuted..    */.
2b7d0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20      if( NEVER(. 
2b7e0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
2b7f0 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e  E_OK && pPg->pgn
2b800 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o>pPager->dbSize
2b810 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
2b820 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29 20  Page(pPg).    ) 
2b830 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
2b840 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
2b850 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
2b860 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e  /* Write the con
2b870 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
2b880 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  e out to the dat
2b890 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
2b8a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b8b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2b8c0 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67  sert( (pPg->flag
2b8d0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2b8e0 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  C)==0 );.      r
2b8f0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
2b900 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c  pagelist(pPager,
2b910 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   pPg);.    }.  }
2b920 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
2b930 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
2b940 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2b950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
2b960 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
2b970 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2b980 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2b990 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
2b9a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
2b9b0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
2b9c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
2b9d0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2b9e0 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   rc); .}.../*.**
2b9f0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
2ba00 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50  itialize a new P
2ba10 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  ager object and 
2ba20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
2ba30 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67   it.** in *ppPag
2ba40 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68  er. The pager sh
2ba50 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
2ba60 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73  be freed by pass
2ba70 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c  ing it.** to sql
2ba80 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
2ba90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
2baa0 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
2bab0 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  s the path to th
2bac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2bad0 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a  to open..** If z
2bae0 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
2baf0 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
2bb00 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
2bb10 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
2bb20 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
2bb30 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
2bb40 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79  ached. Temporary
2bb50 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65   files are be de
2bb60 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
2bb70 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79  ically when they
2bb80 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20   are closed. If 
2bb90 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
2bba0 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a  emory:" then .**
2bbb0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2bbc0 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
2bbd0 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  e. It is never w
2bbe0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
2bbf0 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20  .** This can be 
2bc00 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
2bc10 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
2bc20 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
2bc30 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65  he nExtra parame
2bc40 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68  ter specifies th
2bc50 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2bc60 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
2bc70 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69  ated.** along wi
2bc80 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66  th each page ref
2bc90 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61  erence. This spa
2bca0 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
2bcb0 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76  to the user.** v
2bcc0 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ia the sqlite3Pa
2bcd0 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50  gerGetExtra() AP
2bce0 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  I..**.** The fla
2bcf0 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
2bd00 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
2bd10 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
2bd20 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
2bd30 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
2bd40 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
2bd50 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
2bd60 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
2bd70 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
2bd80 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  R_* flags..**.**
2bd90 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
2bda0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
2bdb0 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
2bdc0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
2bdd0 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
2bde0 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
2bdf0 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
2be00 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
2be10 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
2be20 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
2be30 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
2be40 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
2be50 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
2be60 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
2be70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2be80 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
2be90 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
2bea0 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
2beb0 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
2bec0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
2bed0 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
2bee0 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
2bef0 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
2bf00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
2bf10 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
2bf20 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
2bf30 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
2bf40 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
2bf50 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
2bf60 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
2bf70 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
2bf80 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
2bf90 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2bfa0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
2bfb0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
2bfc0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2bfd0 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
2bfe0 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
2bff0 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
2c000 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
2c010 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
2c020 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
2c030 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2c040 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
2c050 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2c060 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
2c070 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
2c080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
2c090 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
2c0a0 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
2c0b0 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
2c0c0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c0d0 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
2c0e0 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
2c0f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
2c100 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
2c110 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
2c120 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
2c130 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
2c140 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
2c150 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f  init)(DbPage*) /
2c160 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65  * Function to re
2c170 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73  initialize pages
2c180 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
2c190 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
2c1a0 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
2c1b0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
2c1c0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
2c1d0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
2c1e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2c1f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2c200 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
2c210 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
2c220 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
2c230 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
2c240 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
2c250 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
2c260 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2c270 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2c280 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
2c290 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
2c2a0 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
2c2b0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2c2c0 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
2c2d0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
2c2e0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
2c2f0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2c300 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
2c310 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
2c320 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
2c330 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
2c340 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
2c350 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2c360 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
2c370 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c380 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
2c390 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
2c3a0 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
2c3b0 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
2c3c0 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
2c3d0 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
2c3e0 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63  rnal */.  int pc
2c3f0 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
2c400 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20  e3PcacheSize(); 
2c410 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
2c420 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50  o allocate for P
2c430 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73  Cache */.  u32 s
2c440 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2c450 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2c460 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c  SIZE;  /* Defaul
2c470 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  t page size */. 
2c480 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
2c490 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49  i = 0;    /* URI
2c4a0 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f   args to copy */
2c4b0 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b  .  int nUri = 0;
2c4c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c4d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2c4e0 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a  f URI args at *z
2c4f0 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  Uri */..  /* Fig
2c500 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
2c510 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
2c520 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
2c530 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
2c540 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
2c550 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
2c560 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
2c570 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
2c580 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73  l). This.  ** is
2c590 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61   the maximum spa
2c5a0 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
2c5b0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
2c5c0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2c5d0 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67   .  ** and a reg
2c5e0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
2c5f0 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74  e-handle. Note t
2c600 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a  hat a "regular j
2c610 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20  ournal-handle". 
2c620 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61   ** may be a wra
2c630 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20  pper capable of 
2c640 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73  caching the firs
2c650 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  t portion of the
2c660 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
2c670 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20  le in memory to 
2c680 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74  implement the at
2c690 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2c6a0 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20  ization (see .  
2c6b0 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a  ** source file j
2c6c0 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a  ournal.c)..  */.
2c6d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
2c6e0 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73  rnalSize(pVfs)>s
2c6f0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
2c700 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f  Size() ){.    jo
2c710 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
2c720 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f  ROUND8(sqlite3Jo
2c730 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29  urnalSize(pVfs))
2c740 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a  ;.  }else{.    j
2c750 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2c760 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d   ROUND8(sqlite3M
2c770 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29  emJournalSize())
2c780 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
2c790 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
2c7a0 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
2c7b0 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
2c7c0 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
2c7d0 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66  er = 0;..#ifndef
2c7e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
2c7f0 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67  ORYDB.  if( flag
2c800 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59  s & PAGER_MEMORY
2c810 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20   ){.    memDb = 
2c820 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  1;.    if( zFile
2c830 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2c840 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50  e[0] ){.      zP
2c850 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2c860 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69  3DbStrDup(0, zFi
2c870 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
2c880 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
2c890 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2c8a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50  _NOMEM;.      nP
2c8b0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2c8c0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2c8d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c  ame);.      zFil
2c8e0 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  ename = 0;.    }
2c8f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2c900 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
2c910 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
2c920 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
2c930 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
2c940 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
2c950 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
2c960 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
2c970 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
2c980 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
2c990 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
2c9a0 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
2c9b0 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
2c9c0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2c9d0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2c9e0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73  e[0] ){.    cons
2c9f0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e  t char *z;.    n
2ca00 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
2ca10 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
2ca20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
2ca30 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
2ca40 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32  w(0, nPathname*2
2ca50 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
2ca60 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
2ca70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2ca80 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
2ca90 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
2caa0 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  ; /* Make sure i
2cab0 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20  nitialized even 
2cac0 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  if FullPathname(
2cad0 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  ) fails */.    r
2cae0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
2caf0 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
2cb00 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
2cb10 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
2cb20 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2cb30 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2cb40 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
2cb50 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46    z = zUri = &zF
2cb60 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53  ilename[sqlite3S
2cb70 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
2cb80 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65  e)+1];.    while
2cb90 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20  ( *z ){.      z 
2cba0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
2cbb0 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a  30(z)+1;.      z
2cbc0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2cbd0 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a  n30(z)+1;.    }.
2cbe0 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29      nUri = (int)
2cbf0 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a  (&z[1] - zUri);.
2cc00 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72 69      assert( nUri
2cc10 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  >=0 );.    if( r
2cc20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2cc30 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73  nPathname+8>pVfs
2cc40 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a  ->mxPathname ){.
2cc50 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
2cc60 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
2cc70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  en the journal p
2cc80 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a  ath required by.
2cc90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
2cca0 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e  abase being open
2ccb0 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20  ed will be more 
2ccc0 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74  than pVfs->mxPat
2ccd0 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62  hname.      ** b
2cce0 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
2ccf0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64  This means the d
2cd00 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
2cd10 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20  e opened,.      
2cd20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f  ** as it will no
2cd30 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
2cd40 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
2cd50 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20  l file or even. 
2cd60 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f       ** check fo
2cd70 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
2cd80 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a  before reading..
2cd90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2cda0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
2cdb0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
2cdc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cdd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
2cde0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2cdf0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2ce00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2ce10 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
2ce20 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
2ce30 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2ce40 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a  ture, PCache obj
2ce50 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68  ect, the.  ** th
2ce60 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ree file descrip
2ce70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61  tors, the databa
2ce80 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  se file name and
2ce90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
2cea0 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68  ** file name. Th
2ceb0 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f  e layout in memo
2cec0 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  ry is as follows
2ced0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2cee0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20  Pager object    
2cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf00 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62  (sizeof(Pager) b
2cf10 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50  ytes).  **     P
2cf20 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20  Cache object    
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2cf40 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
2cf50 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e() bytes).  ** 
2cf60 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2cf70 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2cf80 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46      (pVfs->szOsF
2cf90 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ile bytes).  ** 
2cfa0 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20      Sub-journal 
2cfb0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2cfc0 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
2cfd0 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
2cfe0 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61       Main journa
2cff0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2d000 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2d010 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2d020 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2d030 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
2d040 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2d050 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  +1 bytes).  **  
2d060 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
2d070 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
2d080 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b     (nPathname+8+
2d090 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20  1 bytes).  */.  
2d0a0 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c  pPtr = (u8 *)sql
2d0b0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
2d0c0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
2d0d0 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20  f(*pPager)) +   
2d0e0 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
2d0f0 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55  cture */.    ROU
2d100 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20  ND8(pcacheSize) 
2d110 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  +           /* P
2d120 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Cache object */.
2d130 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d      ROUND8(pVfs-
2d140 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20  >szOsFile) +    
2d150 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
2d160 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f  b file */.    jo
2d170 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20  urnalFileSize * 
2d180 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2 +          /* 
2d190 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20  The two journal 
2d1a0 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50  files */ .    nP
2d1b0 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55  athname + 1 + nU
2d1c0 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  ri +         /* 
2d1d0 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20  zFilename */.   
2d1e0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b   nPathname + 8 +
2d1f0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
2d200 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  /* zJournal */.#
2d210 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d220 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61  IT_WAL.    + nPa
2d230 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20  thname + 4 + 2  
2d240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61            /* zWa
2d250 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b  l */.#endif.  );
2d260 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2d270 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2d280 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
2d290 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  R(journalFileSiz
2d2a0 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50  e)) );.  if( !pP
2d2b0 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
2d2c0 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68  3DbFree(0, zPath
2d2d0 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
2d2e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2d2f0 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20    }.  pPager =  
2d300 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67              (Pag
2d310 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50  er*)(pPtr);.  pP
2d320 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20  ager->pPCache = 
2d330 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74     (PCache*)(pPt
2d340 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  r += ROUND8(size
2d350 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20  of(*pPager)));. 
2d360 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20   pPager->fd =   
2d370 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2d380 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2d390 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70  cacheSize));.  p
2d3a0 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73  Pager->sjfd = (s
2d3b0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2d3c0 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66  tr += ROUND8(pVf
2d3d0 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20  s->szOsFile));. 
2d3e0 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20   pPager->jfd =  
2d3f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2d400 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
2d410 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  ileSize);.  pPag
2d420 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
2d430 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
2d440 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2d450 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ze);.  assert( E
2d460 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2d470 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ENT(pPager->jfd)
2d480 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2d490 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c  n the Pager.zFil
2d4a0 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e  ename and Pager.
2d4b0 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73  zJournal buffers
2d4c0 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  , if required. *
2d4d0 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  /.  if( zPathnam
2d4e0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
2d4f0 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a   nPathname>0 );.
2d500 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
2d510 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
2d520 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
2d530 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a  me + 1 + nUri);.
2d540 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2d550 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
2d560 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2d570 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72  me);.    if( nUr
2d580 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67  i ) memcpy(&pPag
2d590 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
2d5a0 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69  athname+1], zUri
2d5b0 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  , nUri);.    mem
2d5c0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
2d5d0 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
2d5e0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2d5f0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2d600 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2d610 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c  ame], "-journal\
2d620 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20  000", 8+2);.    
2d630 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2d640 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2d650 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  name, pPager->zJ
2d660 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66  ournal);.#ifndef
2d670 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2d680 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61  .    pPager->zWa
2d690 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  l = &pPager->zJo
2d6a0 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b  urnal[nPathname+
2d6b0 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  8+1];.    memcpy
2d6c0 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a  (pPager->zWal, z
2d6d0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2d6e0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2d6f0 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e  (&pPager->zWal[n
2d700 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c  Pathname], "-wal
2d710 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20  \000", 4+1);.   
2d720 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2d730 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2d740 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2d750 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Wal);.#endif.   
2d760 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2d770 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2d780 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  }.  pPager->pVfs
2d790 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65   = pVfs;.  pPage
2d7a0 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
2d7b0 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70  sFlags;..  /* Op
2d7c0 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
2d7d0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  e..  */.  if( zF
2d7e0 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2d7f0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
2d800 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
2d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d820 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
2d830 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
2d840 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2d850 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2d860 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2d870 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
2d880 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
2d890 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d  ;.    assert( !m
2d8a0 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64  emDb );.    read
2d8b0 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
2d8c0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2d8d0 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  Y);..    /* If t
2d8e0 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
2d8f0 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
2d900 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2d910 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68  ccess,.    ** ch
2d920 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
2d930 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
2d940 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
2d950 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
2d960 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2d970 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2d980 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
2d990 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  m of:.    **.   
2d9a0 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f   **    + SQLITE_
2d9b0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2d9c0 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  E,.    **    + T
2d9d0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
2d9e0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
2d9f0 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
2da00 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
2da10 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
2da20 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
2da30 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
2da40 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2da50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2da60 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
2da70 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
2da80 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
2da90 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69  er->fd);.      i
2daa0 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  f( !readOnly ){.
2dab0 20 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f          setSecto
2dac0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
2dad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2dae0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2daf0 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d  E_SIZE<=SQLITE_M
2db00 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2db10 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69  SIZE);.        i
2db20 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
2db30 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2db40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2db50 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
2db60 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
2db70 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2db80 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
2db90 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2dba0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2dbb0 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
2dbc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2dbd0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2dbe0 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65  flt = (u32)pPage
2dbf0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
2dc00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2dc10 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2dc20 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2dc30 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b  _WRITE.        {
2dc40 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2dc50 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  i;.          ass
2dc60 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2dc70 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
2dc80 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
2dc90 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2dca0 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
2dcb0 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
2dcc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2dcd0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2dce0 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33  _PAGE_SIZE<=6553
2dcf0 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  6);.          fo
2dd00 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
2dd10 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
2dd20 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2dd30 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
2dd40 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
2dd50 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
2dd60 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
2dd70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2dd80 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
2dd90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2dda0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ddb0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2ddc0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
2ddd0 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74  ->noLock = sqlit
2dde0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
2ddf0 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63  Filename, "noloc
2de00 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  k", 0);.      if
2de10 28 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f  ( (iDc & SQLITE_
2de20 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29  IOCAP_IMMUTABLE)
2de30 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71  !=0.       || sq
2de40 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2de50 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d  n(zFilename, "im
2de60 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a  mutable", 0) ){.
2de70 20 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61            vfsFla
2de80 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
2de90 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
2dea0 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c        goto act_l
2deb0 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20  ike_temp_file;. 
2dec0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ded0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
2dee0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2def0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
2df00 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
2df10 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
2df20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
2df30 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
2df40 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2df50 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
2df60 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
2df70 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
2df80 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
2df90 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
2dfa0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2dfb0 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f  s branch is also
2dfc0 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d   run for an in-m
2dfd0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
2dfe0 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20  An in-memory.   
2dff0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
2e000 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
2e010 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20  mp-file that is 
2e020 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75  never written ou
2e030 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b  t to.    ** disk
2e040 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d   and uses an in-
2e050 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20  memory rollback 
2e060 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a  journal..    **.
2e070 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
2e080 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72  ch also runs for
2e090 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73   files marked as
2e0a0 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20   immutable..    
2e0b0 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d  */ .act_like_tem
2e0c0 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70  p_file:.    temp
2e0d0 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
2e0e0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2e0f0 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20  AGER_READER;    
2e100 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61   /* Pretend we a
2e110 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
2e120 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  ck */.    pPager
2e130 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53  ->eLock = EXCLUS
2e140 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20  IVE_LOCK;    /* 
2e150 50 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69  Pretend we are i
2e160 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2e170 69 6e 67 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ing mode */.    
2e180 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2e190 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2e1a0 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b     /* Do no lock
2e1b0 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f  ing */.    readO
2e1c0 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
2e1d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e1e0 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
2e1f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2e200 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
2e210 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
2e220 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
2e230 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
2e240 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
2e250 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
2e260 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
2e270 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
2e280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e290 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2e2a0 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
2e2b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2e2c0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
2e2d0 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
2e2e0 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
2e2f0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
2e300 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
2e310 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2e320 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
2e330 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ct. */.  if( rc=
2e340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e350 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
2e360 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 6e 45 78  <1000 );.    nEx
2e370 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
2e380 74 72 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  tra);.    rc = s
2e390 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
2e3a0 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
2e3b0 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
2e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3d0 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
2e3e0 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
2e3f0 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
2e400 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2e410 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2e420 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61  error occurred a
2e430 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 20  bove, free the  
2e440 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2e450 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
2e460 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
2e470 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e480 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2e490 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
2e4a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
2e4b0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
2e4c0 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69  Space);.    sqli
2e4d0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
2e4e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2e4f0 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
2e500 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
2e510 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
2e520 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
2e530 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2e540 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
2e550 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
2e560 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
2e570 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
2e580 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2e590 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
2e5a0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2e5b0 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
2e5c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2e5d0 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
2e5e0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
2e5f0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e600 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
2e610 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e620 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
2e630 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e640 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
2e650 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
2e660 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
2e670 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
2e680 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2e690 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
2e6a0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
2e6b0 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
2e6c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e6d0 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2e6e0 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
2e6f0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2e700 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
2e710 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
2e720 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2e730 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2e740 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
2e750 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2e760 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
2e770 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
2e780 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
2e790 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
2e7a0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2e7b0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
2e7c0 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
2e7d0 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
2e7e0 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
2e7f0 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
2e800 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74  adOnly;.  assert
2e810 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
2e820 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e830 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
2e840 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
2e850 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  empFile;.  if( p
2e860 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2e870 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e880 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30  ger->fullSync==0
2e890 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e8a0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2e8b0 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  s==0 );.    asse
2e8c0 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  rt( pPager->walS
2e8d0 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2e8e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e8f0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2e900 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
2e910 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c      pPager->full
2e920 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
2e930 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
2e940 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2e950 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
2e960 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d  ->walSyncFlags =
2e970 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2e980 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54  MAL | WAL_SYNC_T
2e990 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20  RANSACTIONS;.   
2e9a0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2e9b0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2e9c0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
2e9d0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
2e9e0 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
2e9f0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2ea00 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
2ea10 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
2ea20 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
2ea30 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31  er->nExtra = (u1
2ea40 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  6)nExtra;.  pPag
2ea50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
2ea60 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
2ea70 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
2ea80 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
2ea90 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2eaa0 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
2eab0 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
2eac0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
2ead0 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c   if( !useJournal
2eae0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2eaf0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2eb00 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2eb10 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  OFF;.  }else if(
2eb20 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
2eb30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2eb40 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2eb50 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
2eb60 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
2eb70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
2eb80 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2eb90 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
2eba0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2ebb0 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
2ebc0 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d  Reinit;.  /* mem
2ebd0 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
2ebe0 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
2ebf0 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
2ec00 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a  .  /* pPager->sz
2ec10 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mmap = SQLITE_DE
2ec20 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20  FAULT_MMAP_SIZE 
2ec30 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62  // will be set b
2ec40 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20  y btree.c */..  
2ec50 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
2ec60 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
2ec70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65  TE_OK;.}.../* Ve
2ec80 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61  rify that the da
2ec90 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
2eca0 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20 6f  not be deleted o
2ecb0 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66 72  r renamed out fr
2ecc0 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20  om.** under the 
2ecd0 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 53  pager.  Return S
2ece0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20  QLITE_OK if the 
2ecf0 64 61 74 61 62 61 73 65 20 69 73 20 73 74 69 6c  database is stil
2ed00 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68 74 0a  l were it ought.
2ed10 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b  ** to be on disk
2ed20 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
2ed30 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f  ro (SQLITE_READO
2ed40 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73  NLY_DBMOVED or s
2ed50 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 0a  ome other error.
2ed60 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c  ** code from sql
2ed70 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 29 20  ite3OsAccess()) 
2ed80 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2ed90 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67  has gone missing
2eda0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2edb0 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
2edc0 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
2edd0 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76 65  {.  int bHasMove
2ede0 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  d = 0;.  int rc;
2edf0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
2ee00 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75 72  tempFile ) retur
2ee10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
2ee20 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
2ee30 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
2ee40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
2ee50 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  t( pPager->zFile
2ee60 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d 3e  name && pPager->
2ee70 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a  zFilename[0] );.
2ee80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2ee90 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
2eea0 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
2eeb0 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20  CNTL_HAS_MOVED, 
2eec0 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69  &bHasMoved);.  i
2eed0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
2eee0 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a  TFOUND ){.    /*
2eef0 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56 45   If the HAS_MOVE
2ef00 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69  D file-control i
2ef10 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c  s unimplemented,
2ef20 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
2ef30 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73   file.    ** has
2ef40 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e   not been moved.
2ef50 20 20 54 68 61 74 20 69 73 20 74 68 65 20 68 69    That is the hi
2ef60 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69 6f  storical behavio
2ef70 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72 69  r of SQLite: pri
2ef80 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72  or to.    ** ver
2ef90 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e  sion 3.8.3, it n
2efa0 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a  ever checked */.
2efb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2efc0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
2efd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2efe0 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20   bHasMoved ){.  
2eff0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
2f000 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a  ADONLY_DBMOVED;.
2f010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2f020 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
2f030 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2f040 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74  ed after transit
2f050 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45  ioning from PAGE
2f060 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50  R_UNLOCK to.** P
2f070 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
2f080 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74  e. It tests if t
2f090 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
2f0a0 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e  urnal present in
2f0b0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
2f0c0 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65  tem for the give
2f0d0 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a  n pager. A hot j
2f0e0 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
2f0f0 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  at .** needs to 
2f100 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  be played back. 
2f110 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  According to thi
2f120 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f  s function, a ho
2f130 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
2f140 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  e exists if the 
2f150 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
2f160 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ia are met:.**.*
2f170 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61  *   * The journa
2f180 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e  l file exists in
2f190 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
2f1a0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20  , and.**   * No 
2f1b0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
2f1c0 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2f1d0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
2f1e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
2f1f0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  nd.**   * The da
2f200 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
2f210 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68  lf is greater th
2f220 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
2f230 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ze, and.**   * T
2f240 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
2f250 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f260 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  e exists and is 
2f270 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20  not 0x00..**.** 
2f280 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
2f290 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2f2a0 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
2f2b0 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
2f2c0 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
2f2d0 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
2f2e0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
2f2f0 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
2f300 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
2f310 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
2f320 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
2f330 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f340 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65   is.** just dele
2f350 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65  ted using OsDele
2f360 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  te, *pExists is 
2f370 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2f380 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
2f390 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
2f3a0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
2f3b0 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  ot check if ther
2f3c0 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  e is a master jo
2f3d0 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a  urnal filename.*
2f3e0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2f3f0 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
2f400 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20  re is, and that 
2f410 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2f420 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
2f430 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20  exist, then the 
2f440 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f450 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20  not really hot. 
2f460 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
2f470 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
2f480 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65  l return a false
2f490 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70  -positive. The p
2f4a0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a  ager_playback().
2f4b0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
2f4c0 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
2f4d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2f4e0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2f4f0 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f   and .** will no
2f500 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  t roll it back. 
2f510 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d  .**.** If a hot-
2f520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f530 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20  found to exist, 
2f540 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2f550 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  to 1 and .** SQL
2f560 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2f570 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e   If no hot-journ
2f580 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2f590 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a  nt, *pExists is.
2f5a0 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  ** set to 0 and 
2f5b0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2f5c0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2f5d0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2f5e0 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74  trying.** to det
2f5f0 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
2f600 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72  r not a hot-jour
2f610 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
2f620 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a   the IO error.**
2f630 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2f640 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2f650 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75  of *pExists is u
2f660 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
2f670 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
2f680 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2f690 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
2f6a0 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
2f6b0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
2f6c0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
2f6d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2f6e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  _OK;           /
2f6f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2f700 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20  .  int exists = 
2f710 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2f720 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f   /* True if a jo
2f730 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2f740 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  esent */.  int j
2f750 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70  rnlOpen = !!isOp
2f760 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
2f770 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2f780 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2f790 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2f7a0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2f7b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2f7c0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2f7d0 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73  R_OPEN );..  ass
2f7e0 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30  ert( jrnlOpen==0
2f7f0 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44   || ( sqlite3OsD
2f800 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2f810 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  tics(pPager->jfd
2f820 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49  ) &.    SQLITE_I
2f830 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
2f840 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b  _WHEN_OPEN.  ));
2f850 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ..  *pExists = 0
2f860 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65  ;.  if( !jrnlOpe
2f870 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
2f880 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
2f890 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2f8a0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
2f8b0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
2f8c0 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  sts);.  }.  if( 
2f8d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f8e0 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69   exists ){.    i
2f8f0 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20  nt locked = 0;  
2f900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f910 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65  ue if some proce
2f920 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
2f930 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20  VED lock */..   
2f940 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69   /* Race conditi
2f950 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65  on here:  Anothe
2f960 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
2f970 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e  have been holdin
2f980 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  g the.    ** the
2f990 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
2f9a0 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61  nd have a journa
2f9b0 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71  l open at the sq
2f9c0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
2f9d0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f  .    ** call abo
2f9e0 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c  ve, but then del
2f9f0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2fa00 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63  and drop the loc
2fa10 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  k before.    ** 
2fa20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f  we get to the fo
2fa30 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f  llowing sqlite3O
2fa40 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2fa50 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74  ck() call.  If t
2fa60 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  hat.    ** is th
2fa70 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75  e case, this rou
2fa80 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b  tine might think
2fa90 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2faa0 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20  journal when.   
2fab0 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72   ** in fact ther
2fac0 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73  e is none.  This
2fad0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61   results in a fa
2fae0 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69  lse-positive whi
2faf0 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ch will.    ** b
2fb00 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
2fb10 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75  the playback rou
2fb20 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33  tine.  Ticket #3
2fb30 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  883..    */.    
2fb40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68  rc = sqlite3OsCh
2fb50 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2fb60 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63  pPager->fd, &loc
2fb70 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ked);.    if( rc
2fb80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2fb90 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20  locked ){.      
2fba0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
2fbb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2fbc0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2fbd0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2fbe0 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70  */..      rc = p
2fbf0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
2fc00 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
2fc10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2fc20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fc30 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2fc40 62 61 73 65 20 69 73 20 7a 65 72 6f 20 70 61 67  base is zero pag
2fc50 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 61 74  es in size, that
2fc60 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68   means that eith
2fc70 65 72 20 28 31 29 20 74 68 65 0a 20 20 20 20 20  er (1) the.     
2fc80 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73     ** journal is
2fc90 20 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20   a remnant from 
2fca0 61 20 70 72 69 6f 72 20 64 61 74 61 62 61 73 65  a prior database
2fcb0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
2fcc0 61 6d 65 20 77 68 65 72 65 0a 20 20 20 20 20 20  ame where.      
2fcd0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
2fce0 65 20 66 69 6c 65 20 62 75 74 20 6e 6f 74 20 74  e file but not t
2fcf0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64  he journal was d
2fd00 65 6c 65 74 65 64 2c 20 6f 72 20 28 32 29 20 74  eleted, or (2) t
2fd10 68 65 20 69 6e 69 74 69 61 6c 0a 20 20 20 20 20  he initial.     
2fd20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
2fd30 6e 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65 73  n that populates
2fd40 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
2fd50 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
2fd60 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
2fd70 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
2fd80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2fd90 65 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  e can be deleted
2fda0 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 61 6b 65  .  However, take
2fdb0 20 63 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   care.        **
2fdc0 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65 20 74   not to delete t
2fdd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2fde0 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
2fdf0 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20 20 20   open due to.   
2fe00 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f       ** journal_
2fe10 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a 20 20  mode=PERSIST..  
2fe20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2fe30 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26   if( nPage==0 &&
2fe40 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2fe50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2fe60 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
2fe70 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
2fe80 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  ( pagerLockDb(pP
2fe90 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
2fea0 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
2feb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2fec0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
2fed0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2fee0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
2fef0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2ff00 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2ff10 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  e ) pagerUnlockD
2ff20 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
2ff30 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2ff40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2ff50 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
2ff60 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
2ff70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2ff80 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
2ff90 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2ffa0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
2ffb0 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76  ion has a reserv
2ffc0 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2ffd0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2ffe0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2fff0 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20  file. Now check 
30000 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20  that there is.  
30010 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65          ** at le
30020 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f  ast one non-zero
30030 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74   bytes at the st
30040 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
30050 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
30060 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
30070 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69  s, then we consi
30080 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  der this journal
30090 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e   to be hot. If n
300a0 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ot, .          *
300b0 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f  * it can be igno
300c0 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  red..          *
300d0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
300e0 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
300f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
30100 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
30110 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
30120 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
30130 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30140 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
30150 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
30160 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
30170 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20  fd, f, &f);.    
30180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30190 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
301a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
301b0 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b     u8 first = 0;
301c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
301d0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
301e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f  pPager->jfd, (vo
301f0 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20  id *)&first, 1, 
30200 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
30210 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
30220 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
30230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30250 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30260 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
30270 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
30280 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30290 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
302a0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
302b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
302c0 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72   *pExists = (fir
302d0 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  st!=0);.        
302e0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
302f0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
30300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
30310 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  * If we cannot o
30320 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  pen the rollback
30330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
30340 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66   order to see if
30350 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30360 69 74 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65  it has a zero he
30370 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74  ader, that might
30380 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f   be due to an I/
30390 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20  O error, or.    
303a0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69          ** it mi
303b0 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68  ght be due to th
303c0 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  e race condition
303d0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
303e0 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20   and in.        
303f0 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33      ** ticket #3
30400 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79  883.  Either way
30410 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
30420 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
30430 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
30440 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61   This might be a
30450 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
30460 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20    But if it is, 
30470 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
30480 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
30490 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  c journal playba
304a0 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20  ck and recovery 
304b0 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64  mechanism will d
304c0 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eal.            
304d0 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72  ** with it under
304e0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
304f0 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  ck where we do n
30500 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ot need to.     
30510 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20         ** worry 
30520 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63  so much with rac
30530 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20  e conditions..  
30540 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
30550 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
30560 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
30570 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
30580 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
30590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
305a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
305b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
305c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
305d0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
305e0 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
305f0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
30600 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73  e file..** It is
30610 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
30620 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
30630 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74  uire() until aft
30640 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
30650 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63  .** has been suc
30660 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64  cessfully called
30670 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f  . If a shared-lo
30680 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
30690 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ld when.** this 
306a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
306b0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
306c0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  p..**.** The fol
306d0 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  lowing operation
306e0 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f  s are also perfo
306f0 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rmed by this fun
30700 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31  ction..**.**   1
30710 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
30720 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50  s currently in P
30730 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
30740 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a  (no lock held.**
30750 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74        on the dat
30760 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65  abase file), the
30770 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
30780 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  made to obtain a
30790 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20  .**      SHARED 
307a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
307b0 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64  base file. Immed
307c0 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
307d0 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  aining.**      t
307e0 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
307f0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
30800 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61  is checked for a
30810 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a   hot-journal,.**
30820 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70        which is p
30830 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72  layed back if pr
30840 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67  esent. Following
30850 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   any hot-journal
30860 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61   .**      rollba
30870 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ck, the contents
30880 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72   of the cache ar
30890 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63  e validated by c
308a0 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  hecking.**      
308b0 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e  the 'change-coun
308c0 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68  ter' field of th
308d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
308e0 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20  header and.**   
308f0 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20     discarded if 
30900 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74  they are found t
30910 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a  o be invalid..**
30920 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20  .**   2) If the 
30930 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
30940 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
30950 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  de, and there ar
30960 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  e currently.**  
30970 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69      no outstandi
30980 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
30990 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20   any pages, and 
309a0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
309b0 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74  state,.**      t
309c0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
309d0 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20  s made to clear 
309e0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
309f0 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a  by discarding.**
30a00 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e        the conten
30a10 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63  ts of the page c
30a20 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67  ache and rolling
30a30 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a   back any open j
30a40 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66  ournal.**      f
30a50 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
30a60 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
30a70 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
30a80 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
30a90 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
30aa0 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c  * occurs while l
30ab0 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  ocking the datab
30ac0 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f  ase, checking fo
30ad0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
30ae0 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c  file or .** roll
30af0 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
30b00 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20  al file, the IO 
30b10 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
30b20 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
30b30 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
30b40 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
30b50 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
30b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
30b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30b80 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
30b90 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
30ba0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
30bb0 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f  rom b-tree and o
30bc0 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61  nly when there a
30bd0 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74  re no.  ** outst
30be0 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68  anding pages. Th
30bf0 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  is implies that 
30c00 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  the pager state 
30c10 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20  should either.  
30c20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45  ** be OPEN or RE
30c30 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20  ADER. READER is 
30c40 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
30c50 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72   the pager is or
30c60 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78   was in .  ** ex
30c70 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
30c80 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
30c90 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
30ca0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
30cb0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
30cc0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
30cd0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
30ce0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
30cf0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
30d00 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
30d10 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
30d20 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
30d30 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d  .  if( NEVER(MEM
30d40 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  DB && pPager->er
30d50 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e  rCode) ){ return
30d60 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
30d70 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65  ; }..  if( !page
30d80 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
30d90 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
30da0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e==PAGER_OPEN ){
30db0 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75  .    int bHotJou
30dc0 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20  rnal = 1;       
30dd0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
30de0 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74  ere exists a hot
30df0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f   journal-file */
30e00 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ..    assert( !M
30e10 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63 20  EMDB );..    rc 
30e20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
30e30 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
30e40 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  RED_LOCK);.    i
30e50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30e60 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
30e70 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
30e80 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  =NO_LOCK || pPag
30e90 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
30ea0 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
30eb0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
30ec0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
30ed0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
30ee0 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
30ef0 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
30f00 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
30f10 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
30f20 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
30f30 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
30f40 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
30f50 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
30f60 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
30f70 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  <=SHARED_LOCK ){
30f80 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
30f90 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
30fa0 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b  , &bHotJournal);
30fb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
30fc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30fd0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
30fe0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
30ff0 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a   bHotJournal ){.
31000 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
31010 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
31020 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31030 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
31040 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ACK;.        got
31050 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
31060 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  }..      /* Get 
31070 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
31080 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
31090 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
310a0 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
310b0 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
310c0 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
310d0 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
310e0 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
310f0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45  o the.      ** E
31100 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
31110 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
31120 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
31130 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
31140 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
31150 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
31160 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
31170 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
31180 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
31190 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
311a0 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
311b0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
311c0 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20  rolling the .   
311d0 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
311e0 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  l back..      **
311f0 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75   .      ** Becau
31200 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
31210 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
31220 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
31230 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  ed, any.      **
31240 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
31250 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63  ttempting to acc
31260 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
31270 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74   file will get t
31280 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
31290 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
312a0 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f  de and fail to o
312b0 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
312c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20  CLUSIVE lock .  
312d0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61      ** on the da
312e0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
312f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
31300 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
31310 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  is in locking_mo
31320 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
31330 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20  e, the lock is. 
31340 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64       ** downgrad
31350 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43  ed to SHARED_LOC
31360 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  K before this fu
31370 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
31380 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
31390 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
313a0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
313b0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  E_LOCK);.      i
313c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
313d0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
313e0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
313f0 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  . .      /* If i
31400 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
31410 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69   open and the fi
31420 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  le exists on dis
31430 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20  k, open the .   
31440 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f     ** journal fo
31450 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
31460 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73  ess. Write acces
31470 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
31480 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  cause .      ** 
31490 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
314a0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
314b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
314c0 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a  l be kept open .
314d0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73        ** and pos
314e0 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
314f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
31500 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69  er on. Also, wri
31510 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20  te-access .     
31520 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72   ** is usually r
31530 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c  equired to final
31540 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
31550 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  in journal_mode=
31560 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a  persist .      *
31570 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f  * mode (and also
31580 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   for journal_mod
31590 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f  e=truncate on so
315a0 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20  me systems)..   
315b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
315c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
315d0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
315e0 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
315f0 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
31600 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
31610 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  ion managed to g
31620 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69  et in and roll i
31630 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20  t back before . 
31640 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e       ** this con
31650 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64  nection obtained
31660 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
31670 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69  ock above. Or, i
31680 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  t .      ** may 
31690 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61  mean that the pa
316a0 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65  ger was in the e
316b0 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
316c0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75  this.      ** fu
316d0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
316e0 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
316f0 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
31700 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  exist..      */.
31710 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65        if( !isOpe
31720 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
31730 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
31740 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
31750 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
31760 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  s;.        int b
31770 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20  Exists;         
31780 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
31790 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
317a0 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  sts */.        r
317b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
317c0 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20  ess(.           
317d0 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
317e0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
317f0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
31800 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  bExists);.      
31810 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31820 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29  _OK && bExists )
31830 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
31840 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
31850 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
31860 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
31870 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
31880 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
31890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
318a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
318b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
318c0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
318d0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
318e0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
318f0 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
31900 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
31910 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31920 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
31930 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
31940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31950 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51  TE_OK && fout&SQ
31960 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
31970 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
31980 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
31990 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
319a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
319b0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
319c0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
319d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
319e0 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50    }. .      /* P
319f0 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
31a00 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
31a10 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
31a20 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  se write.      *
31a30 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
31a40 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
31a50 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61  ck. Purge the ca
31a60 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20  che before.     
31a70 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   ** playing back
31a80 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
31a90 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27   so that we don'
31aa0 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20  t end up with.  
31ab0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73      ** an incons
31ac0 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53  istent cache.  S
31ad0 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ync the hot jour
31ae0 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
31af0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62  ng.      ** it b
31b00 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72  ack since the pr
31b10 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68  ocess that crash
31b20 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20  ed and left the 
31b30 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot journal.    
31b40 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69    ** probably di
31b50 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e  d not sync it an
31b60 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65  d we are require
31b70 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63  d to always sync
31b80 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
31b90 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
31ba0 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20  ying it back..  
31bb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
31bc0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
31bd0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
31be0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
31bf0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
31c00 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
31c10 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
31c20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31c30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31c40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
31c50 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
31c60 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
31c70 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
31c80 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
31c90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31ca0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
31cb0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
31cc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  e ){.        pag
31cd0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
31ce0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
31cf0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31d00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31d10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
31d20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
31d30 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  aken if an error
31d40 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
31d50 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20  ying to open.   
31d60 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20       ** or roll 
31d70 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
31d80 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  al while holding
31d90 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
31da0 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ck. The.        
31db0 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ** pager_unlock(
31dc0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  ) routine will b
31dd0 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
31de0 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c  returning to unl
31df0 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ock.        ** t
31e00 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  he file. If the 
31e10 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66  unlock attempt f
31e20 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72  ails, then Pager
31e30 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20  .eLock must be. 
31e40 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f         ** set to
31e50 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73   UNKNOWN_LOCK (s
31e60 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
31e70 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
31e80 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a   for .        **
31e90 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62   UNKNOWN_LOCK ab
31ea0 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  ove for an expla
31eb0 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20  nation). .      
31ec0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
31ed0 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  In order to get 
31ee0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74  pager_unlock() t
31ef0 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50  o do this, set P
31f00 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20  ager.eState to. 
31f10 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f         ** PAGER_
31f20 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20  ERROR now. This 
31f30 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
31f40 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61  counted as a tra
31f50 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nsition.        
31f60 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ** to ERROR stat
31f70 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64  e in the state d
31f80 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f  iagram at the to
31f90 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a  p of this file,.
31fa0 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65          ** since
31fb0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
31fc0 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70  e same call to p
31fd0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
31fe0 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20  ll very.        
31ff0 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73  ** shortly trans
32000 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ition the pager 
32010 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50  object to the OP
32020 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e  EN state. Callin
32030 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73  g.        ** ass
32040 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
32050 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77  ) would fail now
32060 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e  , as it should n
32070 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20  ot be possible. 
32080 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
32090 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
320a0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65  hen there are ze
320b0 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ro outstanding p
320c0 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  age .        ** 
320d0 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20  references..    
320e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
320f0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
32100 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
32110 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
32120 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
32130 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
32140 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
32150 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32160 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
32170 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
32180 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
32190 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
321a0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e && pPager->eLo
321b0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  ck>SHARED_LOCK).
321c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
321d0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
321e0 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 28 0a 20  >tempFile && (. 
321f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
32200 42 61 63 6b 75 70 20 0a 20 20 20 20 20 7c 7c 20  Backup .     || 
32210 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
32220 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
32230 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20  PCache)>0 .     
32240 7c 7c 20 55 53 45 46 45 54 43 48 28 70 50 61 67  || USEFETCH(pPag
32250 65 72 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20  er).    )){.    
32260 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
32270 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
32280 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
32290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
322a0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
322b0 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
322c0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
322d0 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
322e0 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
322f0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
32300 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
32310 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
32320 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
32330 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
32340 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
32350 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
32360 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
32370 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
32380 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
32390 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
323a0 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
323b0 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
323c0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
323d0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
323e0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
323f0 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
32400 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
32410 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
32420 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
32430 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
32440 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
32450 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
32460 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
32470 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
32480 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
32490 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
324a0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
324b0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
324c0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
324d0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
324e0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
324f0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
32500 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
32510 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
32520 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
32530 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
32540 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
32550 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
32560 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
32570 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
32580 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
32590 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
325a0 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
325b0 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
325c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
325d0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
325e0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
325f0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
32600 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
32610 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
32620 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
32630 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
32640 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
32650 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
32660 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32670 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
32680 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
32690 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
326a0 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
326b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
326c0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
326d0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
326e0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
326f0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
32700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
32710 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
32720 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
32730 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
32740 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ers));.      }..
32750 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
32760 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
32770 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
32780 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32790 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rs))!=0 ){.     
327a0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
327b0 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
327c0 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61   /* Unmap the da
327d0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
327e0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
327f0 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
32800 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
32810 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65  ay have truncate
32820 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
32830 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74  ile and then ext
32840 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20  ended it back.  
32850 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20        ** to its 
32860 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68  original size wh
32870 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
32880 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67   was not holding
32890 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20   a lock..       
328a0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
328b0 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74   there may exist
328c0 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61   a Pager.pMap ma
328d0 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61  pping that appea
328e0 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  rs.        ** to
328f0 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69   be the right si
32900 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63  ze but is not ac
32910 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76  tually valid. Av
32920 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20  oid this.       
32930 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20   ** possibility 
32940 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65  by unmapping the
32950 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20   db here. */.   
32960 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43       if( USEFETC
32970 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  H(pPager) ){.   
32980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
32990 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
329a0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
329b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
329c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
329d0 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
329e0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
329f0 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
32a00 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
32a10 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
32a20 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
32a30 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
32a40 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
32a50 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
32a60 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
32a70 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  esent(pPager);.#
32a80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32a90 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72  IT_WAL.    asser
32aa0 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  t( pPager->pWal=
32ab0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
32ac0 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _OK );.#endif.  
32ad0 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
32ae0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
32af0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
32b00 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
32b10 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
32b20 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
32b30 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
32b40 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
32b50 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
32b60 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
32b70 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
32b80 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
32b90 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  r, &pPager->dbSi
32ba0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  ze);.  }.. faile
32bb0 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
32bc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
32bd0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
32be0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
32bf0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
32c00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32c10 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32c20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
32c30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
32c40 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
32c50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
32c60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
32c70 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
32c80 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
32c90 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
32ca0 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
32cb0 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
32cc0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
32cd0 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
32ce0 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
32cf0 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
32d00 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
32d10 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
32d20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
32d30 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
32d40 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
32d50 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
32d60 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
32d70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
32d80 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
32d90 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
32da0 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
32db0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
32dc0 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
32dd0 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33 50  ==0 && (sqlite3P
32de0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
32df0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
32e00 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  0) ){.    pagerU
32e10 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
32e20 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
32e30 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
32e40 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
32e50 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  ge number pgno i
32e60 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28  n pager pPager (
32e70 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65  a page.** refere
32e80 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50  nce has type DbP
32e90 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65  age*). If the re
32ea0 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
32eb0 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
32ec0 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
32ed0 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
32ee0 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
32ef0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
32f00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
32f10 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
32f20 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
32f30 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
32f40 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
32f50 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
32f60 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
32f70 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
32f80 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
32f90 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
32fa0 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
32fb0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
32fc0 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
32fd0 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
32fe0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
32ff0 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
33000 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
33010 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
33020 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
33030 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
33040 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
33050 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
33060 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
33070 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
33080 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
33090 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
330a0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
330b0 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
330c0 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
330d0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
330e0 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
330f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33100 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
33110 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
33120 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
33130 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
33140 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
33150 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
33160 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
33170 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
33180 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
33190 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  age or if a .** 
331a0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
331b0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
331c0 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65  noContent parame
331d0 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ter and the .** 
331e0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
331f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
33200 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
33210 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
33220 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
33230 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
33240 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
33250 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
33260 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
33270 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
33280 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  s. .**.** If noC
33290 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
332a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
332b0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
332c0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
332d0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ** of the page. 
332e0 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
332f0 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  wo scenarios:.**
33300 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65  .**   a) When re
33310 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73  ading a free-lis
33320 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d  t leaf page from
33330 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61   the database, a
33340 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68  nd.**.**   b) Wh
33350 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69  en a savepoint i
33360 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
33370 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20  ack and we need 
33380 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20  to load.**      
33390 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20  a new page into 
333a0 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20  the cache to be 
333b0 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
333c0 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20  data read.**    
333d0 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70    from the savep
333e0 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  oint journal..**
333f0 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
33400 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
33410 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  he data returned
33420 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65   is zeroed inste
33430 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72  ad of.** being r
33440 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
33450 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
33460 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f  lly, the bits co
33470 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
33480 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e  o pgno in Pager.
33490 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76  pInJournal (bitv
334a0 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
334b0 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
334c0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
334d0 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65  le) and the Page
334e0 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
334f0 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20  vepoint bitvecs 
33500 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73  of any open.** s
33510 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65  avepoints are se
33520 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  t. This means if
33530 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64   the page is mad
33540 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e  e writable at an
33550 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68  y.** point in th
33560 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20  e future, using 
33570 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
33580 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69  3PagerWrite(), i
33590 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77  ts contents.** w
335a0 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e  ill not be journ
335b0 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73  aled. This saves
335c0 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61   IO..**.** The a
335d0 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
335e0 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
335f0 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
33600 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
33610 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
33620 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
33630 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
33640 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
33650 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
33660 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
33670 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
33680 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
33690 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
336a0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
336b0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
336c0 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
336d0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
336e0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
336f0 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
33700 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
33710 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
33720 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
33730 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
33740 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
33750 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
33760 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
33770 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
33780 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
33790 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
337a0 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
337b0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
337c0 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
337d0 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
337e0 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
337f0 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
33800 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
33810 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
33820 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
33830 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
33840 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
33850 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
33860 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
33870 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
33880 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
33890 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
338a0 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
338b0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
338c0 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
338d0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
338e0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
338f0 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
33900 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
33910 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
33920 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33930 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
33940 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d  ;.  u32 iFrame =
33950 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
33960 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20      /* Frame to 
33970 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69  read from WAL fi
33980 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  le */.  const in
33990 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66  t noContent = (f
339a0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
339b0 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20  _NOCONTENT);..  
339c0 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74 61  /* It is accepta
339d0 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65 61  ble to use a rea
339e0 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61  d-only (mmap) pa
339f0 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ge for any page 
33a00 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65  except.  ** page
33a10 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e   1 if there is n
33a20 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
33a30 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20  ion open or the 
33a40 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59  ACQUIRE_READONLY
33a50 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73  .  ** flag was s
33a60 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
33a70 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c  caller. And so l
33a80 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69 73  ong as the db is
33a90 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d   not a .  ** tem
33aa0 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
33ab0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a  ory database.  *
33ac0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d  /.  const int bM
33ad0 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d 31  mapOk = (pgno!=1
33ae0 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50 61   && USEFETCH(pPa
33af0 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61 67  ger).   && (pPag
33b00 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33b10 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61  R_READER || (fla
33b20 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52  gs & PAGER_GET_R
33b30 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66  EADONLY)).#ifdef
33b40 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
33b50 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e  C.   && pPager->
33b60 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66  xCodec==0.#endif
33b70 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  .  );..  assert(
33b80 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
33b90 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
33ba0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
33bb0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
33bc0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
33bd0 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20  t( noContent==0 
33be0 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b  || bMmapOk==0 );
33bf0 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ..  if( pgno==0 
33c00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
33c10 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33c20 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  T;.  }..  /* If 
33c30 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
33c40 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
33c50 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
33c60 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20   immediately. . 
33c70 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72   ** Otherwise, r
33c80 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20  equest the page 
33c90 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20  from the PCache 
33ca0 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20  layer. */.  if( 
33cb0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
33cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33cd0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
33ce0 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  rrCode;.  }else{
33cf0 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  .    if( bMmapOk
33d00 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
33d10 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
33d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
33d30 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
33d40 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
33d50 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
33d60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33d70 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
33d80 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
33d90 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  .    if( bMmapOk
33da0 20 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b   && iFrame==0 ){
33db0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
33dc0 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72  ta = 0;..      r
33dd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74  c = sqlite3OsFet
33de0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a  ch(pPager->fd, .
33df0 20 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28            (i64)(
33e00 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72  pgno-1) * pPager
33e10 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67  ->pageSize, pPag
33e20 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70  er->pageSize, &p
33e30 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20  Data.      );.. 
33e40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33e50 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20  ITE_OK && pData 
33e60 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
33e70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
33e80 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20  GER_READER ){.  
33e90 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73 71          pPg = sq
33ea0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
33eb0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
33ec0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33ed0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
33ee0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
33ef0 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
33f00 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  ge(pPager, pgno,
33f10 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20   pData, &pPg);. 
33f20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
33f30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
33f40 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
33f50 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d  >fd, (i64)(pgno-
33f60 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  1)*pPager->pageS
33f70 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
33f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
33f90 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
33fa0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
33fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
33fc0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
33fd0 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20   pPg;.          
33fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33ff0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34000 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
34010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34020 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
34030 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
34050 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65    {.      sqlite
34060 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70  3_pcache_page *p
34070 42 61 73 65 3b 0a 20 20 20 20 20 20 70 42 61 73  Base;.      pBas
34080 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
34090 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
340a0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29  PCache, pgno, 3)
340b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 61 73  ;.      if( pBas
340c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
340d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
340e0 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70 50  heFetchStress(pP
340f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
34100 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20 20  gno, &pBase);.  
34110 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34120 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
34130 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34150 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
34160 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34170 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d  chFinish(pPager-
34180 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
34190 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66  pBase);.      if
341a0 28 20 70 50 67 3d 3d 30 20 29 20 72 63 20 3d 20  ( pPg==0 ) rc = 
341b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
341c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
341d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
341e0 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
341f0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
34200 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72  3PcacheFetch() r
34210 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
34220 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   or the.    ** p
34230 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79  ager was already
34240 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
34250 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
34260 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
34270 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50  d..    ** Set pP
34280 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20  g to 0 and jump 
34290 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e  to the exception
342a0 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20   handler.  */.  
342b0 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67    pPg = 0;.    g
342c0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
342d0 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73  e_err;.  }.  ass
342e0 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
342f0 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  pgno==pgno );.  
34300 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
34310 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  )->pPager==pPage
34320 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  r || (*ppPage)->
34330 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20  pPager==0 );..  
34340 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  if( (*ppPage)->p
34350 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74  Pager && !noCont
34360 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  ent ){.    /* In
34370 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
34380 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f  cache already co
34390 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61  ntains an initia
343a0 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20  lized copy of.  
343b0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52    ** the page. R
343c0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75  eturn without fu
343d0 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20  rther ado.  */. 
343e0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
343f0 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  =PAGER_MAX_PGNO 
34400 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  && pgno!=PAGER_M
34410 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
34420 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
34430 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48  tat[PAGER_STAT_H
34440 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  IT]++;.    retur
34450 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
34460 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
34470 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
34480 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
34490 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
344a0 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
344b0 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
344c0 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20  d.  */..    pPg 
344d0 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70  = *ppPage;.    p
344e0 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
344f0 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ger;..    /* The
34500 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75   maximum page nu
34510 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65  mber is 2^31. Re
34520 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
34530 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20  UPT if a page.  
34540 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
34550 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
34560 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63  r the unused loc
34570 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65  king-page, is re
34580 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20  quested. */.    
34590 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
345a0 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
345b0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
345c0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
345d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
345e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
345f0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34600 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
34610 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20     if( MEMDB || 
34620 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
34630 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74  gno || noContent
34640 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
34650 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
34660 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
34670 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
34680 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34690 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f  FULL;.        go
346a0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
346b0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
346c0 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e      if( noConten
346d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
346e0 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74  Failure to set t
346f0 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49  he bits in the I
34700 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63  nJournal bit-vec
34710 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a  tors is benign..
34720 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65          ** It me
34730 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  rely means that 
34740 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65  we might do some
34750 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a   extra work to j
34760 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20  ournal a .      
34770 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64    ** page that d
34780 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
34790 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e  be journaled.  N
347a0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20  evertheless, be 
347b0 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  sure .        **
347c0 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73   to test the cas
347d0 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63  e where a malloc
347e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
347f0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65  ile trying to se
34800 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  t .        ** a 
34810 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63  bit in a bit vec
34820 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
34830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
34840 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
34850 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
34860 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
34870 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
34880 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
34890 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69  rc = ) sqlite3Bi
348a0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
348b0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
348c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
348d0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
348e0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
348f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53     }.        TES
34900 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
34910 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
34920 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ecs(pPager, pgno
34930 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
34940 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
34950 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
34960 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
34970 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
34980 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
34990 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
349a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
349b0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
349c0 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
349d0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
349e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
349f0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
34a00 6c 28 70 50 61 67 65 72 29 20 26 26 20 62 4d 6d  l(pPager) && bMm
34a10 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  apOk==0 ){.     
34a20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
34a30 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
34a40 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20  er->pWal, pgno, 
34a50 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20  &iFrame);.      
34a60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34a70 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
34a80 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34a90 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
34aa0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
34ab0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
34ac0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
34ad0 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b  AGER_STAT_MISS]+
34ae0 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  +;.      rc = re
34af0 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46  adDbPage(pPg, iF
34b00 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  rame);.      if(
34b10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34b20 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
34b30 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34b50 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
34b60 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d  gehash(pPg);.  }
34b70 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
34b80 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71  E_OK;..pager_acq
34b90 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65  uire_err:.  asse
34ba0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
34bb0 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  K );.  if( pPg )
34bc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
34bd0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
34be0 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
34bf0 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
34c00 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ..  *ppPage = 0;
34c10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34c20 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
34c30 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
34c40 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
34c50 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
34c60 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
34c70 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
34c80 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
34c90 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
34ca0 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
34cb0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
34cc0 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65  cache. .**.** Se
34cd0 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
34ce0 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
34cf0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
34d00 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
34d10 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
34d20 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
34d30 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
34d40 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
34d50 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
34d60 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
34d70 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
34d80 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
34d90 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
34da0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
34db0 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
34dc0 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
34dd0 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
34de0 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
34df0 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
34e00 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
34e10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
34e20 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74  o pgno){.  sqlit
34e30 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
34e40 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
34e50 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
34e60 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
34e70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
34e80 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20  ger->pPCache!=0 
34e90 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71 6c  );.  pPage = sql
34ea0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
34eb0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
34ec0 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 72 65 74   pgno, 0);.  ret
34ed0 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
34ee0 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61  eFetchFinish(pPa
34ef0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
34f00 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  no, pPage);.}../
34f10 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
34f20 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
34f30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
34f40 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
34f50 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
34f60 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
34f70 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
34f80 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
34f90 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
34fa0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
34fb0 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
34fc0 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
34fd0 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
34fe0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
34ff0 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
35000 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  moved..*/.void s
35010 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35020 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a  NotNull(DbPage *
35030 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
35040 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
35050 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50 61   pPg!=0 );.  pPa
35060 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
35070 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  r;.  if( pPg->fl
35080 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50  ags & PGHDR_MMAP
35090 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65 6c   ){.    pagerRel
350a0 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67 29  easeMapPage(pPg)
350b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
350c0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
350d0 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
350e0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
350f0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76  sed(pPager);.}.v
35100 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
35110 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
35120 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 20  g){.  if( pPg ) 
35130 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
35140 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d  fNotNull(pPg);.}
35150 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
35160 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
35170 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
35180 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
35190 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
351a0 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
351b0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
351c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
351d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
351e0 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
351f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
35200 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
35210 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35220 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
35230 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
35240 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
35250 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
35260 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
35270 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
35280 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
35290 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
352a0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
352b0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
352c0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
352d0 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
352e0 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
352f0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
35300 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
35310 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
35320 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
35330 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
35340 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
35350 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
35360 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
35370 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
35380 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
35390 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
353a0 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
353b0 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
353c0 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
353d0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
353e0 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
353f0 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
35400 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
35410 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
35420 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
35430 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
35440 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
35450 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
35460 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
35470 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
35480 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
35490 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
354a0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
354b0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
354c0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
354d0 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
354e0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
354f0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
35500 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
35510 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
35520 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
35530 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
35540 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
35550 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
35560 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
35570 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
35580 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
35590 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
355a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
355b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
355c0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
355d0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
355e0 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
355f0 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
35600 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
35610 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35620 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
35630 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73  R_LOCKED );.  as
35640 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
35650 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
35660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35670 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35680 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
35690 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
356a0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
356b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
356c0 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
356d0 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
356e0 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
356f0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
35700 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
35710 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
35720 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
35730 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
35740 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
35750 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
35760 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61  Code;..  if( !pa
35770 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
35780 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
35790 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
357a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
357b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
357c0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
357d0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
357e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
357f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
35800 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
35810 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
35820 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
35830 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65   }.  .    /* Ope
35840 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
35850 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
35860 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
35870 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
35880 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
35890 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
358a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
358b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
358c0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
358d0 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
358e0 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
358f0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65  ->jfd);.      }e
35900 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
35910 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20  st int flags =  
35920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35930 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f   /* VFS flags to
35940 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
35950 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
35960 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
35970 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
35980 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
35990 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d      (pPager->tem
359a0 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20  pFile ? .       
359b0 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
359c0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
359d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
359e0 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20  _JOURNAL):.     
359f0 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
35a00 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
35a10 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a  ).          );..
35a20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
35a30 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  y that the datab
35a40 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68  ase still has th
35a50 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69  e same name as i
35a60 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20  t did when.     
35a70 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69     ** it was ori
35a80 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20  ginally opened. 
35a90 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
35aa0 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
35ab0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  d(pPager);.     
35ac0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35ad0 45 5f 4f 4b 20 29 7b 0a 23 69 66 64 65 66 20 53  E_OK ){.#ifdef S
35ae0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
35af0 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
35b00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35b10 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20  JournalOpen(.   
35b20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
35b30 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
35b40 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
35b50 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
35b60 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
35b70 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65          );.#else
35b80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
35b90 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
35ba0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
35bb0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
35bc0 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65  d, flags, 0);.#e
35bd0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
35be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
35bf0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
35c00 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
35c10 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
35c20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20   }.  .  .    /* 
35c30 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
35c40 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
35c50 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
35c60 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20  le and open .   
35c70 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
35c80 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
35c90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
35ca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35cb0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  {.      /* TODO:
35cc0 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66   Check if all of
35cd0 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c   these are reall
35ce0 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  y required. */. 
35cf0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
35d00 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  c = 0;.      pPa
35d10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
35d20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
35d30 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
35d40 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
35d50 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
35d60 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
35d70 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
35d80 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
35d90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35da0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
35db0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
35dc0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
35dd0 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
35de0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
35df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
35e00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35e10 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
35e20 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
35e30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
35e40 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
35e50 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72  CHEMOD;.  }..  r
35e60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
35e70 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65  ** Begin a write
35e80 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
35e90 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
35ea0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
35eb0 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73   .** write-trans
35ec0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
35ed0 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
35ee0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
35ef0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
35f00 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72  If the exFlag ar
35f10 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  gument is false,
35f20 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
35f30 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
35f40 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  D.** lock on the
35f50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
35f60 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
35f70 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
35f80 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
35f90 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
35fa0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
35fb0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
35fc0 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
35fd0 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
35fe0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
35ff0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
36000 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  y argument is no
36010 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
36020 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65   sub-journal ope
36030 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
36040 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  is transaction w
36050 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ill be opened as
36060 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
36070 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  le. This.** has 
36080 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65  no effect if the
36090 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
360a0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28  already opened (
360b0 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65  as it may be whe
360c0 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20  n.** running in 
360d0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20  exclusive mode) 
360e0 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  or if the transa
360f0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
36100 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d  equire a.** sub-
36110 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20  journal. If the 
36120 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
36130 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74  ument is zero, t
36140 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
36150 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
36160 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  is implemented i
36170 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67  n-memory if pPag
36180 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  er is an in-memo
36190 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a  ry database, .**
361a0 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70   or using a temp
361b0 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72  orary file other
361c0 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
361d0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50  ite3PagerBegin(P
361e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
361f0 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75  t exFlag, int su
36200 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69  bjInMemory){.  i
36210 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
36220 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
36230 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
36240 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
36250 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  de;.  assert( pP
36260 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
36270 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50  GER_READER && pP
36280 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
36290 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50  ER_ERROR );.  pP
362a0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
362b0 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d  ry = (u8)subjInM
362c0 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c  emory;..  if( AL
362d0 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74  WAYS(pPager->eSt
362e0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
362f0 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  R) ){.    assert
36300 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
36310 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  rnal==0 );..    
36320 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
36330 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
36340 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
36350 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74   is configured t
36360 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  o use locking_mo
36370 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e  de=exclusive, an
36380 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  d an.      ** ex
36390 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
363a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
363b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64  not already held
363c0 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e  , obtain it now.
363d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
363e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
363f0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c  usiveMode && sql
36400 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
36410 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
36420 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
36430 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
36440 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
36450 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
36460 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36480 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
36490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
364a0 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
364b0 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
364c0 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  pWal, 1);.      
364d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62  }..      /* Grab
364e0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
364f0 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  on the log file.
36500 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
36510 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20  upgrade to.     
36520 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56   ** PAGER_RESERV
36530 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  ED state. Otherw
36540 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
36550 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
36560 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
36570 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  * The busy-handl
36580 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65  er is not invoke
36590 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e  d if another con
365a0 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a  nection already.
365b0 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74        ** holds t
365c0 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49  he write-lock. I
365d0 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
365e0 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c  upper layer will
365f0 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20   call it..      
36600 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
36610 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69  lite3WalBeginWri
36620 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
36630 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
36640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
36650 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   Obtain a RESERV
36660 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
36670 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
36680 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61   the exFlag para
36690 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  meter.      ** i
366a0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d  s true, then imm
366b0 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65  ediately upgrade
366c0 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c   this to an EXCL
366d0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
366e0 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61        ** busy-ha
366f0 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63  ndler callback c
36700 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  an be used when 
36710 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65  upgrading to the
36720 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20   EXCLUSIVE.     
36730 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f   ** lock, but no
36740 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67  t when obtaining
36750 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
36760 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
36770 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
36780 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
36790 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
367a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
367b0 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b  _OK && exFlag ){
367c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
367d0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
367e0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
367f0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
36800 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
36810 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36820 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67  {.      /* Chang
36830 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b  e to WRITER_LOCK
36840 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  ED state..      
36850 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20  **.      ** WAL 
36860 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e  mode sets Pager.
36870 65 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f  eState to PAGER_
36880 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72  WRITER_LOCKED or
36890 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20   CACHEMOD.      
368a0 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61  ** when it has a
368b0 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
368c0 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f  on, but never to
368d0 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48   DBMOD or FINISH
368e0 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ED..      ** Thi
368f0 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
36900 74 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65  those states the
36910 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61   code to roll ba
36920 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  ck savepoint .  
36930 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
36940 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74  ons may copy dat
36950 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  a from the sub-j
36960 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
36970 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20  database .      
36980 2a 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20  ** file as well 
36990 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  as into the page
369a0 20 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f   cache. Which wo
369b0 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74  uld be incorrect
369c0 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41   in .      ** WA
369d0 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  L mode..      */
369e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
369f0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
36a00 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  ITER_LOCKED;.   
36a10 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
36a20 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
36a30 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
36a40 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
36a50 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
36a60 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
36a70 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50  >dbOrigSize = pP
36a80 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
36a90 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
36aa0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
36ab0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  }..    assert( r
36ac0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
36ad0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36ae0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
36af0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
36b00 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
36b10 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36b20 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
36b30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36b40 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
36b50 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
36b60 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
36b70 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
36b80 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
36b90 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  ger)));.  return
36ba0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
36bb0 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  rk a single data
36bc0 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
36bd0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
36be0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
36bf0 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   .** main journa
36c00 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
36c10 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   as required. If
36c20 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
36c30 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65  tten into.** one
36c40 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
36c50 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
36c60 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
36c70 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e  n the .** Pager.
36c80 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
36c90 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  c and the PagerS
36ca0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
36cb0 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a  point bitvecs.**
36cc0 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76   of any open sav
36cd0 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f  epoints as appro
36ce0 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
36cf0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
36d00 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
36d10 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
36d20 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
36d30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36d40 4f 4b 3b 0a 20 20 69 6e 74 20 69 6e 4a 6f 75 72  OK;.  int inJour
36d50 6e 61 6c 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  nal;..  /* This 
36d60 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63  routine is not c
36d70 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77  alled unless a w
36d80 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
36d90 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20   has already .  
36da0 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e  ** been started.
36db0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
36dc0 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  e may or may not
36dd0 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73   be open at this
36de0 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20   point..  ** It 
36df0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
36e00 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
36e10 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  te..  */.  asser
36e20 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
36e30 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36e40 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
36e50 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36e60 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
36e70 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
36e80 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36e90 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
36ea0 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
36eb0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
36ec0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
36ed0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36ee0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b  r->errCode==0 );
36ef0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36f00 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  r->readOnly==0 )
36f10 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
36f20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  pPg);..  /* The 
36f30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65  journal file nee
36f40 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e  ds to be opened.
36f50 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f   Higher level ro
36f60 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65  utines have alre
36f70 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65  ady.  ** obtaine
36f80 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
36f90 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74  locks to begin t
36fa0 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
36fb0 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20  tion, but the.  
36fc0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
36fd0 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65  nal might not ye
36fe0 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20  t be open. Open 
36ff0 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69  it now if this i
37000 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a  s the case..  **
37010 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f  .  ** This is do
37020 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ne before callin
37030 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  g sqlite3PcacheM
37040 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68  akeDirty() on th
37050 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74  e page. .  ** Ot
37060 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20 77  herwise, if it w
37070 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63  ere done after c
37080 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63  alling sqlite3Pc
37090 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c  acheMakeDirty(),
370a0 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72   then.  ** an er
370b0 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20  ror might occur 
370c0 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f  and the pager wo
370d0 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52  uld end up in WR
370e0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
370f0 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65  e.  ** with page
37100 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
37110 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  y in the cache..
37120 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
37130 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37140 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
37150 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
37160 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
37170 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
37180 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
37190 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
371a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
371b0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
371c0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
371d0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
371e0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
371f0 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ager) );..  /* M
37200 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
37210 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
37220 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
37230 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
37240 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
37250 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
37260 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
37270 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
37280 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
37290 67 29 3b 0a 20 20 69 6e 4a 6f 75 72 6e 61 6c 20  g);.  inJournal 
372a0 3d 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  = pageInJournal(
372b0 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20  pPager, pPg);.  
372c0 69 66 28 20 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  if( inJournal &&
372d0 20 28 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70   (pPager->nSavep
372e0 6f 69 6e 74 3d 3d 30 20 7c 7c 20 21 73 75 62 6a  oint==0 || !subj
372f0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
37300 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  )) ){.    assert
37310 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
37320 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c 73  Pager) );.  }els
37330 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  e{.  .    /* The
37340 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
37350 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
37360 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
37370 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
37380 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
37390 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
373a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
373b0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
373c0 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
373d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
373e0 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
373f0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
37400 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
37410 66 28 20 21 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  f( !inJournal &&
37420 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
37430 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61  ager) ){.      a
37440 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
37450 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
37460 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
37470 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
37480 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70  OrigSize && isOp
37490 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
374a0 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  ){.        u32 c
374b0 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68  ksum;.        ch
374c0 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20  ar *pData2;.    
374d0 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70      i64 iOff = p
374e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
374f0 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  f;..        /* W
37500 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
37510 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
37520 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
37530 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
37540 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
37550 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
37560 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
37570 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
37580 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
37590 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
375a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
375b0 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
375c0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
375d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
375e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
375f0 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Hdr<=pPager->jou
37600 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20  rnalOff );.     
37610 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
37620 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50  , pPg->pData, pP
37630 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
37640 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
37650 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
37660 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
37670 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
37680 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 20  8*)pData2);..   
37690 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
376a0 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
376b0 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  l error occurs w
376c0 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
376d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
376e0 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
376f0 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
37700 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
37710 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
37720 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
37730 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61  se, when the tra
37740 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
37750 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67  ed back, the log
37760 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ic in.        **
37770 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
37780 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
37790 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
377a0 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
377b0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ed.        ** in
377c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
377d0 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
377e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
377f0 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
37800 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f        ** then co
37810 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c  rruption may fol
37820 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  low..        */.
37830 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
37840 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
37850 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20  _SYNC;..        
37860 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
37870 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
37880 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
37890 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
378a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
378b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72  rn rc;.        r
378c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
378d0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
378e0 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
378f0 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34  pageSize, iOff+4
37900 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
37910 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
37920 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
37930 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
37940 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
37950 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  iOff+pPager->pag
37960 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b  eSize+4, cksum);
37970 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
37980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
37990 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  urn rc;..       
379a0 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
379b0 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
379c0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
379d0 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
379e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
379f0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
37a00 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
37a10 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
37a20 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
37a30 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
37a40 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
37a50 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E(("JOURNAL %d p
37a60 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
37a70 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
37a80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50  ,.             P
37a90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
37aa0 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
37ab0 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
37ac0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
37ad0 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
37ae0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
37af0 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 50 61  ));..        pPa
37b00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
37b10 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70  += 8 + pPager->p
37b20 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
37b30 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
37b40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
37b50 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37b60 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
37b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
37b80 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
37b90 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
37ba0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
37bb0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
37bc0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
37bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
37be0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
37bf0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
37c00 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d  );.        rc |=
37c10 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
37c20 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
37c30 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
37c40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37c50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37c60 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
37c70 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
37c80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
37c90 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
37ca0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37cb0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
37cc0 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54  tate!=PAGER_WRIT
37cd0 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20  ER_DBMOD ){.    
37ce0 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
37cf0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
37d00 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  YNC;.        }. 
37d10 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
37d20 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E(("APPEND %d pa
37d30 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
37d40 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
37d50 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
37d60 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
37d70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37d80 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
37d90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
37da0 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  :0)));.      }. 
37db0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
37dc0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
37dd0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
37de0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
37df0 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
37e00 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
37e10 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
37e20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
37e30 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
37e40 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
37e50 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
37e60 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
37e70 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
37e80 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
37e90 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
37ea0 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
37eb0 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
37ec0 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
37ed0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 53 61   if( pPager->nSa
37ee0 76 65 70 6f 69 6e 74 3e 30 20 26 26 20 73 75 62  vepoint>0 && sub
37ef0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
37f00 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  g) ){.      rc =
37f10 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
37f20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
37f30 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
37f40 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
37f50 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
37f60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
37f70 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
37f80 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
37f90 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
37fa0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37fb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
37fc0 20 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f 66   is a variant of
37fd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
37fe0 74 65 28 29 20 74 68 61 74 20 72 75 6e 73 20 77  te() that runs w
37ff0 68 65 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  hen the sector s
38000 69 7a 65 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72  ize.** is larger
38010 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 73   than the page s
38020 69 7a 65 2e 20 20 53 51 4c 69 74 65 20 6d 61 6b  ize.  SQLite mak
38030 65 73 20 74 68 65 20 28 72 65 61 73 6f 6e 61 62  es the (reasonab
38040 6c 65 29 20 61 73 73 75 6d 70 74 69 6f 6e 20 74  le) assumption t
38050 68 61 74 0a 2a 2a 20 61 6c 6c 20 62 79 74 65 73  hat.** all bytes
38060 20 6f 66 20 61 20 73 65 63 74 6f 72 20 61 72 65   of a sector are
38070 20 77 72 69 74 74 65 6e 20 74 6f 67 65 74 68 65   written togethe
38080 72 20 62 79 20 68 61 72 64 77 61 72 65 2e 20 20  r by hardware.  
38090 48 65 6e 63 65 2c 20 61 6c 6c 20 62 79 74 65 73  Hence, all bytes
380a0 20 6f 66 0a 2a 2a 20 61 20 73 65 63 74 6f 72 20   of.** a sector 
380b0 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
380c0 61 6c 6c 65 64 20 69 6e 20 63 61 73 65 20 6f 66  alled in case of
380d0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 69 6e   a power loss in
380e0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
380f0 2a 20 61 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a  * a write..**.**
38100 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 73 65   Usually, the se
38110 63 74 6f 72 20 73 69 7a 65 20 69 73 20 6c 65 73  ctor size is les
38120 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
38130 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  to the page size
38140 2c 20 69 6e 20 77 68 69 63 68 0a 2a 2a 20 63 61  , in which.** ca
38150 73 65 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  se pages can be 
38160 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 77 72 69  individually wri
38170 74 74 65 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tten.  This rout
38180 69 6e 65 20 6f 6e 6c 79 20 72 75 6e 73 20 69 6e  ine only runs in
38190 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 61 6c   the exceptional
381a0 0a 2a 2a 20 63 61 73 65 20 77 68 65 72 65 20 74  .** case where t
381b0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
381c0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
381d0 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2f   sector size..*/
381e0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
381f0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65  OINLINE int page
38200 72 57 72 69 74 65 4c 61 72 67 65 53 65 63 74 6f  rWriteLargeSecto
38210 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  r(PgHdr *pPg){. 
38220 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
38230 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
38240 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
38250 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f  /.  Pgno nPageCo
38260 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
38270 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
38280 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
38290 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
382a0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
382b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382c0 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
382d0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
382e0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
382f0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  */.  int nPage =
38300 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
38310 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
38320 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
38330 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
38340 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  l */.  int ii;  
38350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38360 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
38370 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  unter */.  int n
38380 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20  eedSync = 0;    
38390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
383a0 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61  e if any page ha
383b0 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s PGHDR_NEED_SYN
383c0 43 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50  C */.  Pager *pP
383d0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
383e0 65 72 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  er;   /* The pag
383f0 65 72 20 74 68 61 74 20 6f 77 6e 73 20 70 50 67  er that owns pPg
38400 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65   */.  Pgno nPage
38410 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
38420 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
38430 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
38440 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
38450 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59   doNotSpill NOSY
38460 4e 43 20 62 69 74 20 74 6f 20 31 2e 20 54 68 69  NC bit to 1. Thi
38470 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
38480 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 2a  cannot allow.  *
38490 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  * a journal head
384a0 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  er to be written
384b0 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67   between the pag
384c0 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a  es journaled by.
384d0 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
384e0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  on..  */.  asser
384f0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  t( !MEMDB );.  a
38500 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
38510 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
38520 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 29 3d 3d  LLFLAG_NOSYNC)==
38530 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  0 );.  pPager->d
38540 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49  oNotSpill |= SPI
38550 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 3b 0a 0a  LLFLAG_NOSYNC;..
38560 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
38570 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
38580 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
38590 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
385a0 61 72 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 74 65  are.  ** an inte
385b0 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
385c0 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
385d0 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
385e0 74 69 66 69 65 72 0a 20 20 2a 2a 20 6f 66 20 74  tifier.  ** of t
385f0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
38600 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
38610 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
38620 20 2a 2f 0a 20 20 70 67 31 20 3d 20 28 28 70 50   */.  pg1 = ((pP
38630 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e  g->pgno-1) & ~(n
38640 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
38650 29 20 2b 20 31 3b 0a 0a 20 20 6e 50 61 67 65 43  ) + 1;..  nPageC
38660 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64  ount = pPager->d
38670 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 67  bSize;.  if( pPg
38680 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e  ->pgno>nPageCoun
38690 74 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  t ){.    nPage =
386a0 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
386b0 31 29 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  1)+1;.  }else if
386c0 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
386d0 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
386e0 75 6e 74 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  unt ){.    nPage
386f0 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 3