/ Hex Artifact Content
Login

Artifact 3648e602d484020d10cb514b04ef8f445ed06f30:


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 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 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 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 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 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 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 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73  f.};../*.** Bits
5240: 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f   of the Pager.do
5250: 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20  NotSpill flag.  
5260: 53 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63  See further desc
5270: 72 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a  ription below..*
5280: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5290: 4c 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20  LAG_OFF         
52a0: 30 78 30 31 20 20 20 20 20 20 2f 2a 20 4e 65 76  0x01      /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 20 20 20 20 20 2f 2a 20 43 75   0x02      /* Cu
5300: 72 72 65 6e 74 20 72 6f 6c 6c 69 6e 67 20 62 61  rrent rolling ba
5310: 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 73 70  ck, so do not sp
5320: 69 6c 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ill */.#define S
5330: 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
5340: 20 20 20 20 20 30 78 30 34 20 20 20 20 20 20 2f       0x04      /
5350: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5360: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5370: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  /../*.** A open 
5380: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
5390: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
53a0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
53b0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
53c0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
53d0: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
53e0: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
53f0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5400: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5410: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5420: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5430: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5440: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5450: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5460: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
5470: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
5480: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
5490: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
54a0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
54b0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
54c0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
54d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
54e0: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
54f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5500: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5510: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5520: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5530: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5540: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5550: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5560: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
5570: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
5580: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
5590: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
55a0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
55b0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
55c0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
55d0: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
55e0: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
55f0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5600: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5610: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5620: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5630: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5640: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5650: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5660: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
5670: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
5680: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
5690: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
56a0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
56b0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
56c0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
56d0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
56e0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
56f0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5700: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5710: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5720: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5730: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5740: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5750: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5760: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5770: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
5780: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
5790: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
57a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
57b0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
57c0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
57d0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
57e0: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
57f0: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5800: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5810: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5820: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5830: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5840: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5850: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5860: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5870: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5880: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5890: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
58a0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
58b0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
58c0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
58d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
58e0: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
58f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5900: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5910: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5920: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5930: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5940: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5950: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5960: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5970: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5990: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
59a0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
59b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
59c0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
59d0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
59e0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
59f0: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5a00: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5a10: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5a20: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5a30: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5a40: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5a50: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5a60: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5a70: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5a80: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5a90: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5aa0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ab0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5ac0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5ad0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5ae0: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5af0: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5b00: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5b10: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5b20: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5b40: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5b50: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5b60: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5b70: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5b80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5b90: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5ba0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5bb0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5bc0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5bd0: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5be0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5bf0: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5c00: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5c10: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5c20: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5c30: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5c40: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5c50: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5c60: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5c70: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5c80: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5c90: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ca0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5cb0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5cc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5cd0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5ce0: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5cf0: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5d00: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5d10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5d20: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5d30: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5d40: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5d50: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5d60: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5d70: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5d80: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5d90: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5da0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5db0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5dc0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
5dd0: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
5de0: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
5df0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
5e00: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
5e10: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
5e20: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
5e30: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
5e40: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
5e50: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
5e60: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
5e70: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
5e80: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
5e90: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
5ea0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
5eb0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ec0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
5ed0: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5ee0: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
5ef0: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
5f00: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
5f10: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
5f20: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
5f30: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
5f40: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
5f50: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
5f60: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
5f70: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
5f80: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
5f90: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
5fa0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
5fb0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
5fc0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5fd0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5fe0: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
5ff0: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6000: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6010: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6020: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6030: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6040: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6050: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6060: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
6070: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
6080: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
6090: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
60a0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
60b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
60c0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
60d0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
60e0: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
60f0: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6100: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6110: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6120: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6130: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6140: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6150: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6160: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
6170: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
6180: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
6190: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
61a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
61b0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
61c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
61d0: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
61e0: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
61f0: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6200: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6210: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6220: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6230: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6240: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6250: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6260: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
6270: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
6280: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
6290: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20  e database from 
62a0: 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
62b0: 20 20 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c     is permitted,
62c0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
62d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
62e0: 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c 61 67 20   not. This flag 
62f0: 69 73 20 73 65 74 0a 2a 2a 20 20 20 62 79 20 73  is set.**   by s
6300: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6310: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6320: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6330: 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
6340: 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61  an.**   the data
6350: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6360: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
6370: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
6380: 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67  c from happening
6390: 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65   .**   in betwee
63a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63b0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63c0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63d0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63e0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
63f0: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6400: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6410: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6420: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6430: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6440: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6460: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6470: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6480: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
6490: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64a0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64c0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64d0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64e0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
64f0: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6500: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6510: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6520: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6530: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6540: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6550: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6560: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6570: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6580: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
6590: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65a0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65b0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65c0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65d0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65e0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
65f0: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6600: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6610: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6620: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6630: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6640: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6650: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6660: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6670: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6680: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
6690: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66a0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66c0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66d0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66e0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
66f0: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6700: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6710: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6720: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6730: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6740: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6750: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6760: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6770: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6780: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
6790: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67a0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67b0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67c0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67d0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67e0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
67f0: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6800: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6810: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6820: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6830: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6840: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6850: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6860: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6870: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6880: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
6890: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68a0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68b0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68c0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68d0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68e0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
68f0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6900: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6910: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6920: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6930: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6940: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6950: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6960: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6970: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6980: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
6990: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69b0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69c0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69e0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
69f0: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a00: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a10: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a30: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a50: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a60: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a70: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a80: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6a90: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6aa0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ab0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ac0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ad0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6ae0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6af0: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b00: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b10: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b20: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b30: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b40: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b50: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b60: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b70: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b80: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6b90: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6ba0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bb0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bc0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6bd0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6be0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6bf0: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c00: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c10: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c20: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c30: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c40: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c50: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c60: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c70: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c80: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6c90: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6ca0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cb0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6cd0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6ce0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6cf0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d00: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d10: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d20: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d30: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d40: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d50: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d60: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d70: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d80: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6d90: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6da0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6db0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dc0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6dd0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6de0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6df0: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e00: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e10: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e20: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e30: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e40: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e50: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e60: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e70: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e80: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6e90: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6ea0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6eb0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ec0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ed0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ee0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6ef0: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f00: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f10: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f20: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f30: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f40: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f50: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f60: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f70: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f80: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6f90: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fa0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fb0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fc0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fd0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6fe0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
6ff0: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7000: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7010: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7020: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7030: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7040: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7050: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7060: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7070: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7080: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
7090: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70a0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70b0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70c0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70d0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70e0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
70f0: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7100: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7110: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7120: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7130: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
7140: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
7150: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
7160: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
7170: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
7180: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
7190: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
71a0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
71b0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
71c0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
71d0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
71e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
71f0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
7200: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
7210: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75  values */.  u8 u
7220: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
7230: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
7240: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
7250: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
7260: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
7290: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
72a0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
72b0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
72c0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
72d0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
72e0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
72f0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  ess */.  u8 ckpt
7300: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7310: 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52       /* SYNC_NOR
7320: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
7330: 20 66 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20   for checkpoint 
7340: 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46  */.  u8 walSyncF
7350: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7360: 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   /* SYNC_NORMAL 
7370: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72  or SYNC_FULL for
7380: 20 77 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20   wal writes */. 
7390: 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20   u8 syncFlags;  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73b0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
73c0: 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69  YNC_FULL otherwi
73d0: 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  se */.  u8 tempF
73e0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
73f0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
7400: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
7410: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
7420: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
7430: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
7440: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
7450: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
7460: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7470: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7480: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7490: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
74a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
74f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7500: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
7510: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
7520: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
7530: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
7540: 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73 73  opertion.  Class
7550: 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e 20   members not in 
7560: 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20 65  this block are e
7570: 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a 2a  ither fixed.  **
7580: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
7590: 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65 64  is first created
75a0: 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63 68   or else only ch
75b0: 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65 20  ange when there 
75c0: 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69 66  is a.  ** signif
75d0: 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e 67  icant mode chang
75e0: 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e 67  e (such as chang
75f0: 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69 7a  ing the page_siz
7600: 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2c  e, locking_mode,
7610: 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f 75  .  ** or the jou
7620: 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72 6f  rnal_mode).  Fro
7630: 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c 20  m another view, 
7640: 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d 62  these class memb
7650: 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20 2a  ers describe.  *
7660: 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f 66  * the "state" of
7670: 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69 6c   the pager, whil
7680: 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d 65  e other class me
7690: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20 74  mbers describe t
76a0: 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67 75  he.  ** "configu
76b0: 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20 70  ration" of the p
76c0: 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38 20  ager..  */.  u8 
76d0: 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
76e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
76f0: 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20 52  r state (OPEN, R
7700: 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c 4f  EADER, WRITER_LO
7710: 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38 20  CKED..) */.  u8 
7720: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
7730: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
7740: 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  ent lock held on
7750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7760: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
7770: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
7780: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
7790: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
77a0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
77b0: 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20    u8 setMaster; 
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
77d0: 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e   True if a m-j n
77e0: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69  ame has been wri
77f0: 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a  tten to jrnl */.
7800: 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b    u8 doNotSpill;
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7820: 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68   Do not spill th
7830: 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e  e cache when non
7840: 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73 75  -zero */.  u8 su
7850: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
7860: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
7870: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
7880: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
7890: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
78b0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
78c0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
78d0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
78e0: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
78f0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7900: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7910: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7920: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7940: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7950: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7960: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
7970: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
7980: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
7990: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
79a0: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
79b0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
79d0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
79e0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
79f0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7a20: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7a30: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
7a40: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
7a50: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
7a60: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
7a70: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
7a80: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
7a90: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ab0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7ac0: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7ad0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7ae0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7af0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7b00: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7b10: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7b20: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7b30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7b40: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7b50: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7b60: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
7b70: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7b80: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
7b90: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ba0: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7bb0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7bc0: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7bd0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7be0: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7bf0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7c00: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7c10: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7c20: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7c30: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7c40: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7c50: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7c60: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7c70: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7c80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7c90: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7ca0: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
7cb0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
7cc0: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
7cd0: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
7ce0: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
7cf0: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
7d00: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
7d10: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
7d20: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
7d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d40: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
7d50: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
7d60: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  t[] */.  char db
7d70: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
7d80: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
7d90: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
7da0: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
7db0: 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  /..  u8 bUseFetc
7dc0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7dd0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7de0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 69 6e  xFetch() */.  in
7df0: 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20  t nMmapOut;     
7e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e10: 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65  ber of mmap page
7e20: 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73  s currently outs
7e30: 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c  tanding */.  sql
7e40: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
7e50: 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69  p;       /* Desi
7e60: 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70  red maximum mmap
7e70: 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72   size */.  PgHdr
7e80: 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b   *pMmapFreelist;
7e90: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
7ea0: 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65  f free mmap page
7eb0: 20 68 65 61 64 65 72 73 20 28 70 44 69 72 74 79   headers (pDirty
7ec0: 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  ) */.  /*.  ** E
7ed0: 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e  nd of the routin
7ee0: 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61  ely-changing cla
7ef0: 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a  ss members.  ***
7f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f40: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36  ********/..  u16
7f50: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
7f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
7f70: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
7f80: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
7f90: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20  y page */.  i16 
7fa0: 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
7fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7fc0: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
7fd0: 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68  s at end of each
7fe0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76   page */.  u32 v
7ff0: 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  fsFlags;        
8000: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
8010: 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  for sqlite3_vfs.
8020: 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32  xOpen() */.  u32
8030: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
8040: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
8050: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
8060: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
8070: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
8080: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8090: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
80a0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
80b0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
80d0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
80e0: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
80f0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20  tabase */.  i64 
8100: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
8110: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
8120: 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73  limit for persis
8130: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
8140: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  es */.  char *zF
8150: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
8160: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8180: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
8190: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
81a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
81b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
81c0: 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61  .  int (*xBusyHa
81d0: 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f  ndler)(void*); /
81e0: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61  * Function to ca
81f0: 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a  ll when busy */.
8200: 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
8210: 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a  dlerArg;      /*
8220: 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e   Context argumen
8230: 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c  t for xBusyHandl
8240: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61  er */.  int aSta
8250: 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  t[3];           
8260: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63      /* Total cac
8270: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20  he hits, misses 
8280: 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69  and writes */.#i
8290: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
82a0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20  .  int nRead;   
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
82c0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
82d0: 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a   read */.#endif.
82e0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
82f0: 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a  er)(DbPage*); /*
8300: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
8310: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
8320: 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65  g pages */.#ifde
8330: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
8340: 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  EC.  void *(*xCo
8350: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
8360: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
8370: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
8380: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
8390: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69   void (*xCodecSi
83a0: 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e  zeChng)(void*,in
83b0: 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66  t,int); /* Notif
83c0: 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63  y of page size c
83d0: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64  hanges */.  void
83e0: 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76   (*xCodecFree)(v
83f0: 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20  oid*);          
8400: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
8410: 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a   for the codec *
8420: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
8430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8440: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
8450: 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d  t to xCodec... m
8460: 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66  ethods */.#endif
8470: 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61  .  char *pTmpSpa
8480: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ce;            /
8490: 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
84a0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
84b0: 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20  for tmp use */. 
84c0: 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65   PCache *pPCache
84d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
84e0: 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
84f0: 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cache object */.
8500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8510: 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70  MIT_WAL.  Wal *p
8520: 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
8530: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61        /* Write-a
8540: 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79  head log used by
8550: 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77   "journal_mode=w
8560: 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  al" */.  char *z
8570: 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
8580: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d       /* File nam
8590: 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61  e for write-ahea
85a0: 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a  d log */.#endif.
85b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65  };../*.** Indexe
85c0: 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 50  s for use with P
85d0: 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68  ager.aStat[]. Th
85e0: 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20  e Pager.aStat[] 
85f0: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  array contains.*
8600: 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63 63  * the values acc
8610: 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e 67  essed by passing
8620: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
8630: 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48  _CACHE_HIT, CACH
8640: 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41  E_MISS .** or CA
8650: 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c  CHE_WRITE to sql
8660: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29  ite3_db_status()
8670: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
8680: 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a  ER_STAT_HIT   0.
8690: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
86a0: 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69  AT_MISS  1.#defi
86b0: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52  ne PAGER_STAT_WR
86c0: 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ITE 2../*.** The
86d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
86e0: 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  l variables hold
86f0: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66   counters used f
8700: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75  or.** testing pu
8710: 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68  rposes only.  Th
8720: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f  ese variables do
8730: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a   not exist in.**
8740: 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62   a non-testing b
8750: 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72  uild.  These var
8760: 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74  iables are not t
8770: 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23  hread-safe..*/.#
8780: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8790: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  T.int sqlite3_pa
87a0: 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
87b0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
87c0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
87d0: 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f   read from DB */
87e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
87f0: 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
8800: 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
8810: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
8820: 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f  written to DB */
8830: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
8840: 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20  er_writej_count 
8850: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
8860: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
8870: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
8880: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8890: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
88a0: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
88b0: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
88c0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  ..../*.** Journa
88d0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
88e0: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
88f0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
8900: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
8910: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
8920: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
8930: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
8940: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
8950: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
8960: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
8970: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8980: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
8990: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
89a0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
89b0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
89c0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
89d0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a  ournal is being.
89e0: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
89f0: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
8a00: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
8a10: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
8a20: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
8a30: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
8a40: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
8a50: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
8a60: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
8a70: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
8a80: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
8a90: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
8aa0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
8ab0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
8ac0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
8ad0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
8ae0: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
8af0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
8b00: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
8b10: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
8b20: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8b30: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
8b40: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
8b50: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
8b60: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
8b70: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
8b80: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
8b90: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
8ba0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
8bb0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
8bc0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8bd0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
8be0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
8bf0: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
8c00: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
8c10: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
8c20: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
8c30: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
8c40: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
8c50: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
8c60: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
8c70: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
8c80: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
8c90: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
8ca0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
8cb0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
8cc0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
8cd0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
8ce0: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
8cf0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
8d00: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
8d10: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
8d20: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
8d30: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
8d40: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
8d50: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
8d60: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
8d70: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
8d80: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
8d90: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
8da0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
8db0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
8dc0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
8dd0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
8de0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8df0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
8e00: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
8e10: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
8e20: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
8e30: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
8e40: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
8e50: 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65  the of each page
8e60: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a   record in the j
8e70: 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20  ournal is given 
8e80: 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  by.** the follow
8e90: 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64  ing macro..*/.#d
8ea0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
8eb0: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
8ec0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8ed0: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
8ee0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8ef0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
8f00: 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75  ger. This is usu
8f10: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a  ally the same .*
8f20: 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67  * size as a sing
8f30: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
8f40: 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74  See also setSect
8f50: 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65  orSize()..*/.#de
8f60: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
8f70: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
8f80: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
8f90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
8fa0: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
8fb0: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
8fc0: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
8fd0: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
8fe0: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
8ff0: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
9000: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
9010: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
9020: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
9030: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
9040: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
9050: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
9060: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
9070: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
9080: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
9090: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
90a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
90b0: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
90c0: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
90d0: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
90e0: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
90f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
9100: 6f 20 55 53 45 46 45 54 43 48 20 69 73 20 74 72  o USEFETCH is tr
9110: 75 65 20 69 66 20 77 65 20 61 72 65 20 61 6c 6c  ue if we are all
9120: 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  owed to use the 
9130: 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e 66 65  xFetch and xUnfe
9140: 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  tch.** interface
9150: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
9160: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 6d  database using m
9170: 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f  emory-mapped I/O
9180: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
9190: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
91a0: 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43  # define USEFETC
91b0: 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73 65 46  H(x) ((x)->bUseF
91c0: 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20 64 65  etch).#else.# de
91d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
91e0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
91f0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
9200: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
9210: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
9220: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
9230: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
9240: 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  47../*.** The ar
9250: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
9260: 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64  acro is a file d
9270: 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65 20  escriptor (type 
9280: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a  sqlite3_file*)..
9290: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
92a0: 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  t is not open, o
92b0: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20  r non-zero (but 
92c0: 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e  not 1) if it is.
92d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
92e0: 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  o that expressio
92f0: 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ns can be writte
9300: 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  n as:.**.**   if
9310: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
9320: 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a  >jfd) ){ ....**.
9330: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ** instead of.**
9340: 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65 72  .**   if( pPager
9350: 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
9360: 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ){ ....*/.#defin
9370: 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28  e isOpen(pFd) ((
9380: 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  pFd)->pMethods).
9390: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
93a0: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
93b0: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
93c0: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
93d0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
93e0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
93f0: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
9400: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
9410: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
9420: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
9430: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
9440: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
9450: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
9460: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
9470: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
9480: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9490: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
94a0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
94b0: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
94c0: 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  y) 0.# define pa
94d0: 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
94e0: 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ent(z) SQLITE_OK
94f0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42  .# define pagerB
9500: 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
9510: 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ion(z) SQLITE_OK
9520: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
9530: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
9540: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
9550: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
9560: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
9570: 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66   );.**.** This f
9580: 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e  unction runs man
9590: 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79  y asserts to try
95a0: 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69   to find inconsi
95b0: 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74  stencies in.** t
95c0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
95d0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
95e0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
95f0: 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65   int assert_page
9600: 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  r_state(Pager *p
9610: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
9620: 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74  er = p;..  /* St
9630: 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ate must be vali
9640: 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  d. */.  assert( 
9650: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9660: 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20  _OPEN.       || 
9670: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9680: 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c  _READER.       |
9690: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
96a0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
96b0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
96c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
96d0: 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
96e0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
96f0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
9700: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9710: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9720: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20  RITER_FINISHED. 
9730: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9740: 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a  te==PAGER_ERROR.
9750: 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72    );..  /* Regar
9760: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72  dless of the cur
9770: 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65  rent state, a te
9780: 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69  mp-file connecti
9790: 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65  on always behave
97a0: 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20  s.  ** as if it 
97b0: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
97c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
97d0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e  abase file. It n
97e0: 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a  ever updates.  *
97f0: 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  * the change-cou
9800: 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74  nter field, so t
9810: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
9820: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
9830: 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  s set..  */.  as
9840: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9850: 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b  e==0 || p->eLock
9860: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
9870: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9880: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9890: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
98a0: 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a  untDone );..  /*
98b0: 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e   If the useJourn
98c0: 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  al flag is clear
98d0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  , the journal-mo
98e0: 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22  de must be "OFF"
98f0: 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74  . .  ** And if t
9900: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9910: 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f  is "OFF", the jo
9920: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
9930: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a  not be open..  *
9940: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  /.  assert( p->j
9950: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9960: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9970: 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e  F || p->useJourn
9980: 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
9990: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  p->journalMode!=
99a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
99b0: 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e  E_OFF || !isOpen
99c0: 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  (p->jfd) );..  /
99d0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d  * Check that MEM
99e0: 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e  DB implies noSyn
99f0: 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d  c. And an in-mem
9a00: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e  ory journal. Sin
9a10: 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65  ce .  ** this me
9a20: 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ans an in-memory
9a30: 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20   pager performs 
9a40: 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74  no IO at all, it
9a50: 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65   cannot encounte
9a60: 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53  r .  ** either S
9a70: 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53  QLITE_IOERR or S
9a80: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e  QLITE_FULL durin
9a90: 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68  g rollback or wh
9aa0: 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a  ile finalizing .
9ab0: 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66    ** a journal f
9ac0: 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74  ile. (although t
9ad0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  he in-memory jou
9ae0: 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rnal implementat
9af0: 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65  ion may .  ** re
9b00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
9b10: 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68  R_NOMEM while th
9b20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
9b30: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29  s being written)
9b40: 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68  . It .  ** is th
9b50: 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73  erefore not poss
9b60: 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ible for an in-m
9b70: 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65  emory pager to e
9b80: 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a  nter the ERROR .
9b90: 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f    ** state..  */
9ba0: 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
9bb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
9bc0: 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  oSync );.    ass
9bd0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9be0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9bf0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9c00: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
9c10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9c20: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
9c30: 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73   .    );.    ass
9c40: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d  ert( p->eState!=
9c50: 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
9c60: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
9c70: 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65  OPEN );.    asse
9c80: 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
9c90: 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  p)==0 );.  }..  
9ca0: 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e  /* If changeCoun
9cb0: 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20  tDone is set, a 
9cc0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72  RESERVED lock or
9cd0: 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
9ce0: 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68   held.  ** on th
9cf0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  e file..  */.  a
9d00: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
9d10: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d  hangeCountDone==
9d20: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
9d30: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9d40: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9d50: 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ->eLock!=PENDING
9d60: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74  _LOCK );..  swit
9d70: 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b  ch( p->eState ){
9d80: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
9d90: 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  OPEN:.      asse
9da0: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
9db0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9dc0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9dd0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9de0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9df0: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
9e00: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
9e10: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
9e20: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
9e30: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9e40: 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20  PAGER_READER:.  
9e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9e60: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9e70: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9e80: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9e90: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9ea0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9eb0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  p->eLock>=SHARED
9ec0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62  _LOCK );.      b
9ed0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9ee0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9ef0: 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  KED:.      asser
9f00: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
9f10: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
9f20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f30: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f40: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
9f50: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
9f60: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
9f70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9f80: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9f90: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
9fa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9fb0: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
9fc0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
9fd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9fe0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
9ff0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a000: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a010: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a020: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a030: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a040: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a050: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a060: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
a070: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a080: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a090: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
a0a0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a0b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a0c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a0d0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a0e0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a0f0: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a100: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a110: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
a120: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
a130: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
a140: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
a150: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a160: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
a170: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
a180: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
a190: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
a1a0: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
a1b0: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
a1c0: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
a1d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
a1e0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
a1f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a200: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a210: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a220: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a230: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
a240: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a250: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a260: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a270: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a280: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a290: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a2a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a2b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a2c0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
a2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a2e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a2f0: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a300: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
a310: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a320: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a330: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
a340: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a350: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a360: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
a370: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
a380: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a390: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a3a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a3b0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a3c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a3d0: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a3e0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a400: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
a410: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a420: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a430: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a440: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a450: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a460: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a470: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a480: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a490: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a4a0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a4b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a4c0: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
a4d0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a4e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a4f0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a500: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
a510: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a520: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a530: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a540: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a550: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a560: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a570: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a580: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a590: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
a5a0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
a5b0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a5c0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a5d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a5e0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a5f0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a600: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a610: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a620: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a630: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
a640: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
a650: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
a660: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
a670: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
a680: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
a690: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
a6a0: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
a6b0: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
a6c0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
a6d0: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
a6e0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
a6f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a700: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a710: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
a720: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a730: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
a740: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
a750: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
a760: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a770: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  }..  return 1;.}
a780: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
a790: 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  f NDEBUG */..#if
a7a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a7b0: 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61   ./*.** Return a
a7c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75   pointer to a hu
a7d0: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72  man readable str
a7e0: 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20  ing in a static 
a7f0: 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69  buffer.** contai
a800: 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f  ning the state o
a810: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
a820: 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  ct passed as an 
a830: 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a  argument. This.*
a840: 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  * is intended to
a850: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
a860: 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65  debuggers. For e
a870: 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c  xample, as an al
a880: 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20  ternative.** to 
a890: 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20  "print *pPager" 
a8a0: 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67  in gdb:.**.** (g
a8b0: 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c  db) printf "%s",
a8c0: 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61   print_pager_sta
a8d0: 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74  te(pPager).*/.st
a8e0: 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74  atic char *print
a8f0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
a900: 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63  er *p){.  static
a910: 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d   char zRet[1024]
a920: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
a930: 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74  rintf(1024, zRet
a940: 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d  ,.      "Filenam
a950: 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20  e:      %s\n".  
a960: 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20      "State:     
a970: 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25      %s errCode=%
a980: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b  d\n".      "Lock
a990: 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22  :          %s\n"
a9a0: 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20  .      "Locking 
a9b0: 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d  mode:  locking_m
a9c0: 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20  ode=%s\n".      
a9d0: 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20  "Journal mode:  
a9e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c  journal_mode=%s\
a9f0: 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e  n".      "Backin
aa00: 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c  g store: tempFil
aa10: 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73  e=%d memDb=%d us
aa20: 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20  eJournal=%d\n". 
aa30: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20       "Journal:  
aa40: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d       journalOff=
aa50: 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d  %lld journalHdr=
aa60: 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53  %lld\n".      "S
aa70: 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62  ize:          db
aa80: 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69  size=%d dbOrigSi
aa90: 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65  ze=%d dbFileSize
aaa0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70  =%d\n".      , p
aab0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20  ->zFilename.    
aac0: 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50    , p->eState==P
aad0: 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20  AGER_OPEN       
aae0: 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a       ? "OPEN" :.
aaf0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ab00: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
ab10: 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44           ? "READ
ab20: 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ER" :.        p-
ab30: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ab40: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f  RITER_LOCKED   ?
ab50: 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22   "WRITER_LOCKED"
ab60: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ab70: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
ab80: 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57  ER_CACHEMOD ? "W
ab90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20  RITER_CACHEMOD" 
aba0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
abb0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
abc0: 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52  R_DBMOD    ? "WR
abd0: 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20  ITER_DBMOD" :.  
abe0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
abf0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
ac00: 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52  NISHED ? "WRITER
ac10: 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20  _FINISHED" :.   
ac20: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ac30: 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20  PAGER_ERROR     
ac40: 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20        ? "ERROR" 
ac50: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
ac60: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43    , (int)p->errC
ac70: 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ode.      , p->e
ac80: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20  Lock==NO_LOCK   
ac90: 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b        ? "NO_LOCK
aca0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
acb0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
acc0: 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45  OCK   ? "RESERVE
acd0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ace0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
acf0: 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53  _LOCK  ? "EXCLUS
ad00: 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70  IVE" :.        p
ad10: 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
ad20: 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52  LOCK     ? "SHAR
ad30: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ad40: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
ad50: 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f  LOCK    ? "UNKNO
ad60: 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  WN" : "?error?".
ad70: 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75        , p->exclu
ad80: 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c  siveMode ? "excl
ad90: 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c  usive" : "normal
ada0: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  ".      , p->jou
adb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
adc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
add0: 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20  RY   ? "memory" 
ade0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
adf0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ae00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ae10: 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20       ? "off" :. 
ae20: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
ae30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ae40: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
ae50: 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20    ? "delete" :. 
ae60: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
ae70: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ae80: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
ae90: 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a    ? "persist" :.
aea0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
aeb0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aec0: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
aed0: 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20  TE ? "truncate" 
aee0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
aef0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
af00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
af10: 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22       ? "wal" : "
af20: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
af30: 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c   (int)p->tempFil
af40: 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62  e, (int)p->memDb
af50: 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75  , (int)p->useJou
af60: 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e  rnal.      , p->
af70: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a  journalOff, p->j
af80: 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
af90: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65  , (int)p->dbSize
afa0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67  , (int)p->dbOrig
afb0: 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62  Size, (int)p->db
afc0: 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20  FileSize.  );.. 
afd0: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
afe0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
aff0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
b000: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
b010: 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20  write page *pPg 
b020: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b030: 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20  rnal..** A page 
b040: 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74  needs to be writ
b050: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ten into the sub
b060: 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72  -journal if ther
b070: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20  e exists one.** 
b080: 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76  or more open sav
b090: 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63  epoints for whic
b0a0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  h:.**.**   * The
b0b0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b0c0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
b0d0: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
b0e0: 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a  oint.nOrig, and.
b0f0: 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63  **   * The bit c
b100: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
b110: 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
b120: 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a  is not set in.**
b130: 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
b140: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
b150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b160: 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
b170: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
b180: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
b190: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
b1a0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
b1b0: 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  ;.  Pgno pgno;. 
b1c0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50   int i;.  if( pP
b1d0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
b1e0: 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 70   ){.    pgno = p
b1f0: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 66 6f  Pg->pgno;.    fo
b200: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
b210: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
b220: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 26 70 50  ){.      p = &pP
b230: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
b240: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
b250: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b260: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b270: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
b280: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
b290: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
b2a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b2b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
b2c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b2d0: 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
b2e0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
b2f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
b300: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b310: 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48  ageInJournal(PgH
b320: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
b330: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
b340: 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72  Test(pPg->pPager
b350: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b360: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
b370: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
b380: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
b390: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
b3a0: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
b3b0: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
b3c0: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
b3d0: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
b3e0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
b3f0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
b400: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
b410: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b420: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
b430: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
b440: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
b450: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
b460: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
b470: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
b480: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
b490: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
b4a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b4b0: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
b4c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
b4d0: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
b4e0: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
b4f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b500: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
b510: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
b520: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
b530: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b540: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
b550: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
b560: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
b570: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
b580: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
b590: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
b5a0: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
b5b0: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a  ((u8*)A,B).../*.
b5c0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
b5d0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
b5e0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
b5f0: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
b600: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
b610: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
b620: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
b630: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
b640: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
b650: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
b660: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b670: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b680: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
b690: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
b6a0: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
b6b0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
b6c0: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
b6d0: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  set);.}../*.** U
b6e0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
b6f0: 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c  se file to level
b700: 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75   eLock, which mu
b710: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
b720: 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45  LOCK.** or SHARE
b730: 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65  D_LOCK. Regardle
b740: 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
b750: 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f   not the call to
b760: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75   xUnlock().** su
b770: 63 63 65 65 64 73 2c 20 73 65 74 20 74 68 65 20  cceeds, set the 
b780: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
b790: 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68  able to match th
b7a0: 65 20 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65  e (attempted) ne
b7b0: 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78  w lock..**.** Ex
b7c0: 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65  cept, if Pager.e
b7d0: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
b7e0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e  NKNOWN_LOCK when
b7f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
b800: 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20  s.** called, do 
b810: 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53  not modify it. S
b820: 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
b830: 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
b840: 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f   of .** UNKNOWN_
b850: 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
b860: 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e  anation of this.
b870: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b880: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67  agerUnlockDb(Pag
b890: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
b8a0: 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
b8b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
b8c0: 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
b8d0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
b8e0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
b8f0: 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73  ==eLock );.  ass
b900: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ert( eLock==NO_L
b910: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48  OCK || eLock==SH
b920: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
b930: 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f  ssert( eLock!=NO
b940: 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73  _LOCK || pagerUs
b950: 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
b960: 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  );.  if( isOpen(
b970: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
b980: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
b990: 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20  r->eLock>=eLock 
b9a0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
b9b0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
b9c0: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
b9d0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b9e0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
b9f0: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
ba00: 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38  ger->eLock = (u8
ba10: 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  )eLock;.    }.  
ba20: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
ba30: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
ba40: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d  ger, eLock)).  }
ba50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ba60: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
ba70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
ba80: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
ba90: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
baa0: 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a  er SHARED_LOCK,.
bab0: 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  ** RESERVED_LOCK
bac0: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
bad0: 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65  CK. If the calle
bae0: 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  r is successful,
baf0: 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65   set the.** Page
bb00: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
bb10: 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b   to the new lock
bb20: 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  ing state. .**.*
bb30: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
bb40: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
bb50: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
bb60: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
bb70: 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64  on is .** called
bb80: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
bb90: 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65  it unless the ne
bba0: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20  w locking state 
bbb0: 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  is EXCLUSIVE_LOC
bbc0: 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63  K. .** See the c
bbd0: 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
bbe0: 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e   #define of UNKN
bbf0: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
bc00: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20  explanation .** 
bc10: 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  of this..*/.stat
bc20: 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b  ic int pagerLock
bc30: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
bc40: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
bc50: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bc60: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  OK;..  assert( e
bc70: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
bc80: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45  K || eLock==RESE
bc90: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  RVED_LOCK || eLo
bca0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
bcb0: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  CK );.  if( pPag
bcc0: 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20  er->eLock<eLock 
bcd0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
bce0: 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
bcf0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
bd00: 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
bd10: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
bd20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bd30: 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65  OK && (pPager->e
bd40: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
bd50: 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  CK||eLock==EXCLU
bd60: 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  SIVE_LOCK) ){.  
bd70: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
bd80: 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20  k = (u8)eLock;. 
bd90: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
bda0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
bdb0: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
bdc0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bdd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
bde0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
bdf0: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
be00: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
be10: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
be20: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
be30: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
be40: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
be50: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
be60: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
be70: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
be80: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
be90: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
bea0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
beb0: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
bec0: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
bed0: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
bee0: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
bef0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
bf00: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
bf10: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
bf20: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
bf30: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
bf40: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74  e..**.** The opt
bf50: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73  imization is als
bf60: 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64  o always enabled
bf70: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
bf80: 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61  iles. It is.** a
bf90: 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20  n error to call 
bfa0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
bfb0: 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65   pPager is opene
bfc0: 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d on an in-memor
bfd0: 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  y.** database..*
bfe0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
bff0: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
c000: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
c010: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
c020: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
c030: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
c040: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
c050: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c060: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
c070: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
c080: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
c090: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
c0a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c0b0: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
c0c0: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
c0d0: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
c0e0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
c0f0: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
c100: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
c110: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
c120: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
c150: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
c160: 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20     int nSector; 
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73       /* Sector s
c190: 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ize */.    int s
c1a0: 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  zPage;          
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1c0: 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  Page size */..  
c1d0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
c1e0: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
c1f0: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
c200: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c210: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
c220: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
c230: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
c240: 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67  rSize;.    szPag
c250: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
c260: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
c270: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
c280: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
c290: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
c2a0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c2b0: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
c2c0: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
c2d0: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
c2e0: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
c2f0: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
c300: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
c310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c320: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c330: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c340: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
c350: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c360: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c370: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
c380: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
c390: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
c3a0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
c3b0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
c3c0: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
c3d0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
c3e0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
c3f0: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
c400: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
c410: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
c420: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
c430: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
c440: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
c450: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
c460: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
c470: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
c480: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
c490: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
c4a0: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
c4b0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
c4c0: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
c4d0: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
c4e0: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
c4f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
c500: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
c510: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
c520: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
c530: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
c540: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
c550: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
c560: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
c570: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
c580: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
c590: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c5a0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
c5b0: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
c5c0: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c5d0: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
c5e0: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
c5f0: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
c600: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
c610: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
c620: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
c630: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
c640: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
c650: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
c660: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
c670: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
c680: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
c690: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
c6a0: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
c6b0: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
c6c0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
c6d0: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
c6e0: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
c6f0: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
c700: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
c710: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
c720: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
c730: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
c740: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
c750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
c760: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
c770: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
c780: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
c790: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
c7a0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
c7b0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
c7c0: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
c7d0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
c7e0: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
c7f0: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
c800: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
c810: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
c820: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
c830: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
c840: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
c850: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
c860: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
c870: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
c880: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
c890: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
c8a0: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
c8b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c8c0: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
c8d0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
c8e0: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
c8f0: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
c900: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
c910: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
c920: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
c930: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
c940: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
c950: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
c960: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
c970: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c980: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
c990: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
c9a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
c9b0: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
c9c0: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
c9d0: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
c9e0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
c9f0: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
ca00: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
ca10: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
ca20: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
ca30: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
ca40: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
ca50: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
ca60: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
ca70: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
ca80: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
ca90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
caa0: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
cab0: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
cac0: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
cad0: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
cae0: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
caf0: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
cb00: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
cb10: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
cb20: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
cb30: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
cb40: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cb50: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
cb60: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
cb70: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
cb80: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
cb90: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
cba0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
cbb0: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
cbc0: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
cbd0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
cbe0: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
cbf0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
cc00: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
cc10: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
cc20: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
cc30: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
cc40: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cc50: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
cc60: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
cc70: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
cc80: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
cc90: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
cca0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
ccb0: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
ccc0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
ccd0: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
cce0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
ccf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
cd00: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
cd10: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
cd20: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
cd30: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
cd40: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
cd70: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd90: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
cda0: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
cdb0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
cdc0: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
cdd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
cde0: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
cdf0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
ce00: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
ce10: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
ce20: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
ce30: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
ce40: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
ce50: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce70: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
ce80: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
ce90: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
cea0: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
ceb0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
cec0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
ced0: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
cee0: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
cef0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
cf00: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
cf10: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
cf20: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
cf30: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
cf40: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
cf50: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
cf60: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
cf70: 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  er .   || SQLITE
cf80: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
cf90: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
cfa0: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
cfb0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cfc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
cfd0: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
cfe0: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
cff0: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
d000: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
d010: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
d020: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d030: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
d040: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
d050: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
d060: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
d070: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
d080: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
d090: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
d0a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
d0b0: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
d0c0: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
d0d0: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
d0e0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
d0f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
d100: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
d110: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
d120: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
d130: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
d140: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
d150: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
d160: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
d170: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
d180: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
d190: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
d1a0: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
d1b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
d1c0: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
d1d0: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
d1e0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
d1f0: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
d200: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
d210: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
d220: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
d230: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
d240: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
d250: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
d260: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
d270: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
d280: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
d290: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
d2a0: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
d2b0: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
d2c0: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
d2d0: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
d2e0: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
d2f0: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
d300: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
d310: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
d320: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
d330: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
d340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d360: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3c0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
d3d0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d3e0: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
d3f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
d400: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
d410: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
d420: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
d430: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
d440: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
d450: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
d460: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
d470: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d480: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
d490: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d4a0: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
d4b0: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
d4c0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d4d0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
d4e0: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
d4f0: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
d500: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
d510: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
d520: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
d530: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
d540: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
d550: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
d560: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d570: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
d580: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
d590: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
d5a0: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
d5b0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
d5c0: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
d5d0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
d5e0: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
d5f0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
d600: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
d610: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
d620: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
d630: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
d640: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
d650: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
d660: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
d670: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
d680: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
d690: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
d6a0: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
d6b0: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
d6c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d6d0: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
d6e0: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
d6f0: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
d700: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
d710: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
d720: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
d730: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
d740: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
d750: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
d760: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d770: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
d780: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
d790: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
d7a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
d7b0: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
d7c0: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
d7d0: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
d7e0: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
d7f0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
d800: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
d810: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
d820: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
d830: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
d840: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d850: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
d860: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
d870: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
d880: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
d890: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
d8a0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
d8b0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
d8c0: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
d8d0: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
d8e0: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
d8f0: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
d900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d910: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
d920: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
d930: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
d940: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
d950: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d960: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
d990: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
d9a0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
d9b0: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
d9c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d9d0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
d9e0: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
d9f0: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
da00: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
da10: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
da20: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
da30: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
da40: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
da50: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
da60: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
da70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
da80: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
da90: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
daa0: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
dab0: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
dac0: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
dad0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dae0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
daf0: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
db00: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
db10: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
db20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
db30: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
db40: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
db50: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
db60: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
db70: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
db80: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  |pPager->syncFla
db90: 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  gs);.    }..    
dba0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
dbb0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
dbc0: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75   is committed bu
dbd0: 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  t the write lock
dbe0: 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c   .    ** is stil
dbf0: 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  l held on the fi
dc00: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
dc10: 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e  a size limit con
dc20: 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20  figured for .   
dc30: 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65   ** the persiste
dc40: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  nt journal and t
dc50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
dc60: 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d  currently consum
dc70: 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73  es more.    ** s
dc80: 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c  pace than that l
dc90: 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c  imit allows for,
dca0: 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77   truncate it now
dcb0: 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
dcc0: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e  ed.    ** to syn
dcd0: 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f  c the file follo
dce0: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
dcf0: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
dd00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
dd10: 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b  K && iLimit>0 ){
dd20: 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20  .      i64 sz;. 
dd30: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dd40: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
dd50: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20  er->jfd, &sz);. 
dd60: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
dd70: 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69  ITE_OK && sz>iLi
dd80: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  mit ){.        r
dd90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
dda0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
ddb0: 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  d, iLimit);.    
ddc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
ddd0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
dde0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
ddf0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
de00: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
de10: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
de20: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
de30: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
de40: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
de50: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
de60: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
de70: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
de80: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
de90: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
dea0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
deb0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
dec0: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
ded0: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
dee0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
def0: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
df00: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
df10: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
df20: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
df30: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
df40: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
df50: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
df60: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
df70: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
df80: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
df90: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
dfa0: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
dfb0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
dfc0: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
dfd0: 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rnal..** - 4 byt
dfe0: 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67  es: Database pag
dff0: 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46  e size..** .** F
e000: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
e010: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
e020: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
e030: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
e040: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
e050: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
e060: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
e070: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
e080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e090: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
e0a0: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
e0b0: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
e0c0: 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79  e;  /* Temporary
e0d0: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62   space used to b
e0e0: 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20  uild header */. 
e0f0: 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28   u32 nHeader = (
e100: 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
e110: 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20  Size;/* Size of 
e120: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
e130: 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a  o by zHeader */.
e140: 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20    u32 nWrite;   
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
e170: 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20  f header sector 
e180: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
e190: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
e1c0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
e1d0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
e1e0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
e1f0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
e200: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69  be open. */..  i
e210: 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e  f( nHeader>JOURN
e220: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
e230: 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  ) ){.    nHeader
e240: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
e250: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
e260: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
e270: 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
e280: 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74  nts and any of t
e290: 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64  hem were created
e2a0: 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
e2b0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75   most recent jou
e2c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20  rnal header was 
e2d0: 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
e2e0: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53  the .  ** PagerS
e2f0: 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
e300: 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a  set fields now..
e310: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
e320: 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
e330: 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
e340: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
e350: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
e360: 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20  drOffset==0 ){. 
e370: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
e380: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
e390: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
e3a0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
e3b0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
e3c0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
e3d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e3e0: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
e3f0: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  fset(pPager);.. 
e400: 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20   /* .  ** Write 
e410: 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d  the nRec Field -
e420: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
e430: 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  age records that
e440: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a   follow this.  *
e450: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
e460: 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f  . Normally, zero
e470: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
e480: 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69  his value at thi
e490: 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74  s time..  ** Aft
e4a0: 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  er the records a
e4b0: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
e4c0: 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65  journal (and the
e4d0: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c   journal synced,
e4e0: 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c   .  ** if in ful
e4f0: 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68  l-sync mode), th
e500: 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72  e zero is overwr
e510: 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74  itten with the t
e520: 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  rue number.  ** 
e530: 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20  of records (see 
e540: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a  syncJournal())..
e550: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74    **.  ** A fast
e560: 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69  er alternative i
e570: 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46  s to write 0xFFF
e580: 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65  FFFFF to the nRe
e590: 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20  c field. When.  
e5a0: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a  ** reading the j
e5b0: 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75  ournal this valu
e5c0: 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74  e tells SQLite t
e5d0: 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  o assume that th
e5e0: 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74  e.  ** rest of t
e5f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e600: 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70  contains valid p
e610: 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69  age records. Thi
e620: 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a  s assumption.  *
e630: 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20  * is dangerous, 
e640: 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  as if a failure 
e650: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20  occurred whilst 
e660: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
e670: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
e680: 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   it may contain 
e690: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74  some garbage dat
e6a0: 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  a. There are two
e6b0: 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20   scenarios.  ** 
e6c0: 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20  where this risk 
e6d0: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a  can be ignored:.
e6e0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
e6f0: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
e700: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
e710: 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20   Corruption can 
e720: 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20  follow a.  **   
e730: 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20    power failure 
e740: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79  in this case any
e750: 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  way..  **.  **  
e760: 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49   * When the SQLI
e770: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
e780: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  PEND flag is set
e790: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
e7a0: 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20  s.  **     that 
e7b0: 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20  garbage data is 
e7c0: 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74  never appended t
e7d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
e7e0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
e7f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e800: 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
e810: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28  >noSync );.  if(
e820: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
e830: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
e840: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
e850: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
e860: 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  Y).   || (sqlite
e870: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
e880: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
e890: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
e8a0: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
e8b0: 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28    ){.    memcpy(
e8c0: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
e8d0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
e8e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
e8f0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
e900: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
e910: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
e920: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
e930: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
e940: 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65  zHeader, 0, size
e950: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e960: 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  )+4);.  }..  /* 
e970: 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b  The random check
e980: 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65  -hash initialize
e990: 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f  r */ .  sqlite3_
e9a0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
e9b0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
e9c0: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
e9d0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
e9e0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e9f0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ea00: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
ea10: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
ea20: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
ea30: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
ea40: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
ea50: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
ea60: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
ea70: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
ea80: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
ea90: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
eaa0: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
eab0: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
eac0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ead0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
eae0: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
eaf0: 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  torSize);..  /* 
eb00: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  The page size */
eb10: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
eb20: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
eb30: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c  urnalMagic)+16],
eb40: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
eb50: 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  e);..  /* Initia
eb60: 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20  lizing the tail 
eb70: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73  of the buffer is
eb80: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
eb90: 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a   Everything.  **
eba0: 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74   works find if t
ebb0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d  he following mem
ebc0: 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64  set() is omitted
ebd0: 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a  .  But initializ
ebe0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d  ing.  ** the mem
ebf0: 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c  ory prevents val
ec00: 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c  grind from compl
ec10: 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72  aining, so we ar
ec20: 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a  e willing to.  *
ec30: 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f  * take the perfo
ec40: 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f  rmance hit..  */
ec50: 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64  .  memset(&zHead
ec60: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
ec70: 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c  alMagic)+20], 0,
ec80: 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65  .         nHeade
ec90: 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  r-(sizeof(aJourn
eca0: 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a  alMagic)+20));..
ecb0: 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20    /* In theory, 
ecc0: 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73  it is only neces
ecd0: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
ece0: 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20  e 28 bytes that 
ecf0: 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  the .  ** journa
ed00: 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65  l header consume
ed10: 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
ed20: 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e   file here. Then
ed30: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   increment the .
ed40: 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e    ** Pager.journ
ed50: 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62  alOff variable b
ed60: 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  y JOURNAL_HDR_SZ
ed70: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
ed80: 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69  t .  ** record i
ed90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
eda0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f   following secto
edb0: 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70  r (leaving a gap
edc0: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a   in the file.  *
edd0: 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  * that will be i
ede0: 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64  mplicitly filled
edf0: 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a   in by the OS)..
ee00: 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65    **.  ** Howeve
ee10: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69  r it has been di
ee20: 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e  scovered that on
ee30: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68   some systems th
ee40: 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a  is pattern can .
ee50: 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63    ** be signific
ee60: 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61  antly slower tha
ee70: 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77  n contiguously w
ee80: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
ee90: 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76  he file,.  ** ev
eea0: 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
eeb0: 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74   explicitly writ
eec0: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
eed0: 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28  block of .  ** (
eee0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
eef0: 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20   28) bytes that 
ef00: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
ef10: 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61  . So that is wha
ef20: 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20  t.  ** is done. 
ef30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
ef40: 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20  oop is required 
ef50: 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65  here in case the
ef60: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
ef70: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
ef80: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70  .  ** database p
ef90: 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20  age size. Since 
efa0: 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66  the zHeader buff
efb0: 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72  er is only Pager
efc0: 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62  .pageSize.  ** b
efd0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f  ytes in size, mo
efe0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c  re than one call
eff0: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69   to sqlite3OsWri
f000: 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75  te() may be requ
f010: 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70  ired.  ** to pop
f020: 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65  ulate the entire
f030: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f040: 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20  sector..  */ .  
f050: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
f060: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
f070: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
f080: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
f090: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
f0a0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
f0b0: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
f0c0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
f0d0: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
f0e0: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
f0f0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
f100: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
f110: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
f120: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
f130: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
f140: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f150: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
f160: 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50  nalOff );.    pP
f170: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f180: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
f190: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
f1a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
f1b0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f1c0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
f1d0: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
f1e0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
f1f0: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
f200: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
f210: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
f220: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
f230: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
f240: 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74  ile. The current
f250: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
f260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
f270: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61   given by.** pPa
f280: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e  ger->journalOff.
f290: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
f2a0: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
f2b0: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
f2c0: 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74  or.** a descript
f2d0: 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
f2e0: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
f2f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
f300: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
f310: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52  ccessfully, *pNR
f320: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
f330: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
f340: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
f350: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
f360: 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73   and *pDbSize is
f370: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
f380: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
f390: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
f3a0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
f3b0: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
f3c0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
f3d0: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
f3e0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
f3f0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
f400: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
f410: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
f420: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
f430: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
f440: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
f450: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
f460: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
f470: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
f480: 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20  rned and *pNRec 
f490: 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65  and *PDbSize are
f4a0: 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20   undefined.  If 
f4b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
f4c0: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
f4d0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f4e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
f4f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
f500: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
f510: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
f520: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
f530: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
f540: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
f550: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ject */.  int is
f560: 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e  Hot,.  i64 journ
f570: 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  alSize,         
f580: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
f590: 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
f5a0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
f5b0: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20  .  u32 *pNRec,  
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65  /* OUT: Value re
f5e0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63  ad from the nRec
f5f0: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20   field */.  u32 
f600: 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20  *pDbSize        
f610: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
f620: 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e   Value of origin
f630: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
f640: 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69   field */.){.  i
f650: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
f660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
f670: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
f680: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
f690: 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20  agic[8];     /* 
f6a0: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
f6b0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
f6c0: 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
f6d0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
f6e0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
f6f0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f700: 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20  being read */.. 
f710: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
f720: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
f730: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
f740: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
f750: 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61  n. */..  /* Adva
f760: 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  nce Pager.journa
f770: 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72  lOff to the star
f780: 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65  t of the next se
f790: 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a  ctor. If the.  *
f7a0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
f7b0: 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20  s too small for 
f7c0: 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65  there to be a he
f7d0: 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74  ader stored at t
f7e0: 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20  his.  ** point, 
f7f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
f800: 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  NE..  */.  pPage
f810: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
f820: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
f830: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
f840: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f850: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
f860: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
f870: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
f880: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
f890: 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  E;.  }.  iHdrOff
f8a0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
f8b0: 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61  alOff;..  /* Rea
f8c0: 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38  d in the first 8
f8d0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
f8e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66  urnal header. If
f8f0: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74   they do not mat
f900: 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67  ch.  ** the  mag
f910: 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20  ic string found 
f920: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
f930: 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61  each journal hea
f940: 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  der, return.  **
f950: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66   SQLITE_DONE. If
f960: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
f970: 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  urs, return an e
f980: 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
f990: 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65  wise,.  ** proce
f9a0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ed..  */.  if( i
f9b0: 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21  sHot || iHdrOff!
f9c0: 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
f9d0: 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Hdr ){.    rc = 
f9e0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
f9f0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
fa00: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
fa10: 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20  ), iHdrOff);.   
fa20: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
fa30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fa40: 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  }.    if( memcmp
fa50: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
fa60: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
fa70: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
fa80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fa90: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
faa0: 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
fab0: 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d   first three 32-
fac0: 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  bit fields of th
fad0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fae0: 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20  : The nRec.  ** 
faf0: 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b  field, the check
fb00: 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20  sum-initializer 
fb10: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
fb20: 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61   size at the sta
fb30: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  rt.  ** of the t
fb40: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75  ransaction. Retu
fb50: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
fb60: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
fb70: 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20  s wrong..  */.  
fb80: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
fb90: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fba0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fbb0: 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a  rOff+8, pNRec)).
fbc0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
fbd0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
fbe0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
fbf0: 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67  HdrOff+12, &pPag
fc00: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a  er->cksumInit)).
fc10: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
fc20: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
fc30: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
fc40: 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69  HdrOff+16, pDbSi
fc50: 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  ze)).  ){.    re
fc60: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
fc70: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
fc80: 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
fc90: 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20   u32 iPageSize; 
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fcb0: 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64   Page-size field
fcc0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
fcd0: 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53  er */.    u32 iS
fce0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
fcf0: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
fd00: 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a  -size field of j
fd10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
fd20: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
fd30: 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
fd40: 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72  sector-size jour
fd50: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64  nal header field
fd60: 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51  s. */.    if( SQ
fd70: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fd80: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
fd90: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
fda0: 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29  0, &iSectorSize)
fdb0: 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45  ).     || SQLITE
fdc0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fdd0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fde0: 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26  d, iHdrOff+24, &
fdf0: 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20  iPageSize)).    
fe00: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fe10: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
fe20: 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  * Versions of SQ
fe30: 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e  Lite prior to 3.
fe40: 35 2e 38 20 73 65 74 20 74 68 65 20 70 61 67 65  5.8 set the page
fe50: 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
fe60: 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
fe70: 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f  l header to zero
fe80: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
fe90: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
fea0: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
feb0: 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69     ** variable i
fec0: 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f  s already set to
fed0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
fee0: 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
fef0: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
ff00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61  ==0 ){.      iPa
ff10: 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
ff20: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
ff30: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
ff40: 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72  hat the values r
ff50: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ead from the pag
ff60: 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
ff70: 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20  r-size fields.  
ff80: 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20    ** are within 
ff90: 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e  range. To be 'in
ffa0: 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61   range', both va
ffb0: 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  lues need to be 
ffc0: 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f  a power.    ** o
ffd0: 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68  f two greater th
ffe0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35  an or equal to 5
fff0: 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f  12 or 32, and no
10000 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  t greater than t
10010 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73  heir .    ** res
10020 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20  pective compile 
10030 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d  time maximum lim
10040 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  its..    */.    
10050 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31  if( iPageSize<51
10060 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
10070 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a     || iSectorSiz
10080 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61  e<32.     || iPa
10090 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
100a0 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69  X_PAGE_SIZE || i
100b0 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  SectorSize>MAX_S
100c0 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20  ECTOR_SIZE.     
100d0 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31  || ((iPageSize-1
100e0 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20  )&iPageSize)!=0 
100f0 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69    || ((iSectorSi
10100 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a  ze-1)&iSectorSiz
10110 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  e)!=0 .    ){.  
10120 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69      /* If the ei
10130 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69  ther the page-si
10140 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a  ze or sector-siz
10150 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
10160 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20  -header is .    
10170 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68    ** invalid, th
10180 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  en the process t
10190 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f  hat wrote the jo
101a0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73  urnal-header mus
101b0 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a  t have .      **
101c0 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20   crashed before 
101d0 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73  the header was s
101e0 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63  ynced. In this c
101f0 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ase stop reading
10200 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a   .      ** the j
10210 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
10220 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
10240 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
10250 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61  /* Update the pa
10260 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  ge-size to match
10270 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
10280 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
10290 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20  . .    ** Use a 
102a0 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
102b0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
102c0 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  at malloc failur
102d0 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a  e within .    **
102e0 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
102f0 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20  e() is tested.. 
10300 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
10310 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
10320 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
10330 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a  iPageSize, -1);.
10340 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
10350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  !=SQLITE_OK );..
10360 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10370 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
10380 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
10390 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
103a0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f   .    ** the pro
103b0 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65  cess that create
103c0 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20  d this journal. 
103d0 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  If this journal 
103e0 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  was.    ** creat
103f0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
10400 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
10410 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
10420 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73  outine.    ** is
10430 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72   being called fr
10440 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  om within pager_
10450 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20  playback(). The 
10460 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20  local value.    
10470 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74  ** of Pager.sect
10480 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72  orSize is restor
10490 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
104a0 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20   that routine.. 
104b0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
104c0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69  ->sectorSize = i
104d0 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a  SectorSize;.  }.
104e0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
104f0 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
10500 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
10510 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10520 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
10530 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65  e supplied maste
10540 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
10550 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
10560 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a  file for pager.*
10570 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20  * pPager at the 
10580 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
10590 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
105a0 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62  rnal name must b
105b0 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68  e the last.** th
105c0 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ing written to a
105d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
105e0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
105f0 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
10600 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  , the.** journal
10610 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10620 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20   is advanced to 
10630 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
10640 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a  boundary before.
10650 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77  ** anything is w
10660 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d  ritten. The form
10670 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b  at is:.**.**   +
10680 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
10690 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20  MJ_PGNO..**   + 
106a0 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  N bytes: Master 
106b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
106c0 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20   in utf-8..**   
106d0 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65  + 4 bytes: N (le
106e0 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
106f0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62  ournal name in b
10700 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72  ytes, no nul-ter
10710 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b  minator)..**   +
10720 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   4 bytes: Master
10730 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68   journal name ch
10740 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38  ecksum..**   + 8
10750 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
10760 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
10770 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10780 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
10790 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
107a0 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
107b0 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
107c0 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63   name, where eac
107d0 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70  h byte is interp
107e0 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65  reted as a signe
107f0 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e  d 8-bit integer.
10800 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65  .**.** If zMaste
10810 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  r is a NULL poin
10820 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20  ter (occurs for 
10830 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
10840 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  e transaction), 
10850 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73  .** this call is
10860 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
10870 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
10880 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
10890 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
108a0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
108b0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
108e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
108f0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
10900 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
10910 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73  h of string zMas
10920 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  ter */.  i64 iHd
10930 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
10940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
10950 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e  set of header in
10960 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
10970 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b  .  i64 jrnlSize;
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a      /* Size of j
109a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64  ournal file on d
109b0 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  isk */.  u32 cks
109c0 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  um = 0;         
109d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
109e0 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20  cksum of string 
109f0 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73  zMaster */..  as
10a00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
10a10 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
10a20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
10a30 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
10a40 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
10a50 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  .   || pPager->j
10a60 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
10a70 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
10a80 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67  MORY .   || pPag
10a90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
10aa0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
10ab0 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20  DE_OFF .  ){.   
10ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10ad0 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
10ae0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
10af0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
10b00 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
10b10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10b20 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
10b30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10b40 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  Off );..  /* Cal
10b50 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
10b60 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
10b70 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
10b80 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
10b90 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
10ba0 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
10bb0 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
10bc0 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
10bd0 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
10be0 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
10bf0 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
10c00 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
10c10 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
10c20 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
10c30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10c40 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
10c50 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
10c60 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
10c70 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
10c80 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
10c90 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
10ca0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
10cb0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
10cc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10cd0 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
10ce0 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
10cf0 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
10d00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10d10 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
10d20 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10d30 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
10d40 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10d50 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
10d60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
10d70 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
10d80 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
10d90 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
10da0 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10db0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10dc0 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
10dd0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
10de0 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
10df0 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
10e00 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
10e10 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
10e20 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
10e30 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10e40 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10e50 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10e60 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
10e70 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
10e80 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
10e90 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
10ea0 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
10eb0 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
10ec0 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
10ed0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
10ee0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
10ef0 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
10f00 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  , 8, iHdrOff+4+n
10f10 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b  Master+8))).  ){
10f20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10f30 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
10f40 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61  urnalOff += (nMa
10f50 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20  ster+20);..  /* 
10f60 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
10f70 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75  in peristent-jou
10f80 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20  rnal mode, then 
10f90 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20  the physical .  
10fa0 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ** journal-file 
10fb0 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20  may extend past 
10fc0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
10fd0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
10fe0 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79  me.  ** and 8 by
10ff0 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74  tes of magic dat
11000 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74  a just written t
11010 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73  o the file. This
11020 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72   is .  ** danger
11030 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20  ous because the 
11040 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  code to rollback
11050 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
11060 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ile.  ** will no
11070 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e  t be able to fin
11080 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  d the master-jou
11090 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74  rnal name to det
110a0 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65  ermine .  ** whe
110b0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
110c0 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20  journal is hot. 
110d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65  .  **.  ** Easie
110e0 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69  st thing to do i
110f0 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20  n this scenario 
11100 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  is to truncate t
11110 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
11120 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71   file to the req
11130 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f  uired size..  */
11140 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f   .  if( SQLITE_O
11150 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
11160 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
11170 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a  r->jfd, &jrnlSiz
11180 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69  e)).   && jrnlSi
11190 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ze>pPager->journ
111a0 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72  alOff.  ){.    r
111b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
111c0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
111d0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
111e0 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65  alOff);.  }.  re
111f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11200 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e  * Find a page in
11210 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
11220 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e  given its page n
11230 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a  umber. Return.**
11240 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
11250 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
11260 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
11270 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  page is not .** 
11280 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72  already in memor
11290 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  y..*/.static PgH
112a0 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
112b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
112c0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
112d0 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
11300 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e  */..  /* It is n
11310 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
11320 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63 68 65  a call to Pcache
11330 46 65 74 63 68 28 29 20 77 69 74 68 20 63 72 65  Fetch() with cre
11340 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20  ateFlag==0 to.  
11350 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e  ** fail, since n
11360 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  o attempt to all
11370 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20 6d 65  ocate dynamic me
11380 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d 61 64  mory will be mad
11390 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29  e..  */.  (void)
113a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
113b0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
113c0 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29  he, pgno, 0, &p)
113d0 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
113e0 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74  ./*.** Discard t
113f0 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
11400 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  ts of the in-mem
11410 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a  ory page-cache..
11420 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
11430 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
11440 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
11450 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
11460 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
11470 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  p);.  sqlite3Pca
11480 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d  cheClear(pPager-
11490 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
114a0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72  .** Free all str
114b0 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50  uctures in the P
114c0 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b  ager.aSavepoint[
114d0 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20  ] array and set 
114e0 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53  both.** Pager.aS
114f0 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67  avepoint and Pag
11500 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f  er.nSavepoint to
11510 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65   zero. Close the
11520 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
11530 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e  if it is open an
11540 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  d the pager is n
11550 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
11560 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mode..*/.static 
11570 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53  void releaseAllS
11580 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20  avepoints(Pager 
11590 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
115a0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
115b0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
115c0 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
115d0 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  h Pager.aSavepoi
115e0 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  nt */.  for(ii=0
115f0 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11600 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11610 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
11620 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
11630 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
11640 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
11650 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
11660 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
11670 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  || sqlite3IsMemJ
11680 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73  ournal(pPager->s
11690 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  jfd) ){.    sqli
116a0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
116b0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  r->sjfd);.  }.  
116c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
116d0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29  ger->aSavepoint)
116e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76  ;.  pPager->aSav
116f0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11700 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
11710 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11720 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a  nSubRec = 0;.}..
11730 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69  /*.** Set the bi
11740 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  t number pgno in
11750 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
11760 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
11770 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20   .** bitvecs of 
11780 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
11790 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  nts. Return SQLI
117a0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
117b0 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ful.** or SQLITE
117c0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
117d0 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
117e0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
117f0 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
11800 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50  itvecs(Pager *pP
11810 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
11820 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11840 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
11850 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11860 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20  TE_OK;       /* 
11870 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
11880 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11890 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
118a0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61  t; ii++){.    Pa
118b0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
118c0 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
118d0 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69  point[ii];.    i
118e0 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69  f( pgno<=p->nOri
118f0 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d  g ){.      rc |=
11900 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
11910 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
11920 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t, pgno);.      
11930 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
11940 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11950 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
11960 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
11970 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
11980 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11990 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
119a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
119b0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
119c0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
119d0 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
119e0 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52  not.** in the ER
119f0 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
11a00 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65  wise, it switche
11a10 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50  s the pager to P
11a20 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61  AGER_OPEN.** sta
11a30 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  te..**.** If the
11a40 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
11a50 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
11a60 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61  s mode, the data
11a70 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20  base file is.** 
11a80 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63  completely unloc
11a90 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65  ked. If the file
11aa0 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64   is unlocked and
11ab0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
11ac0 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68   does.** not exh
11ad0 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54  ibit the UNDELET
11ae0 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70  ABLE_WHEN_OPEN p
11af0 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75  roperty, the jou
11b00 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
11b10 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73  closed (if it is
11b20 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66   open)..**.** If
11b30 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11b40 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
11b50 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
11b60 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a  is called, the .
11b70 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
11b80 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61  he pager cache a
11b90 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66  re discarded bef
11ba0 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61  ore switching ba
11bb0 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50  ck to .** the OP
11bc0 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64  EN state. Regard
11bd0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
11be0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11bf0 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a  exclusive-mode.*
11c00 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f  * or not, any jo
11c10 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20  urnal file left 
11c20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
11c30 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74  em will be treat
11c40 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a  ed.** as a hot-j
11c50 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65  ournal and rolle
11c60 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20  d back the next 
11c70 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e  time a read-tran
11c80 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70  saction.** is op
11c90 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72  ened (by this or
11ca0 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   by any other co
11cb0 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74  nnection)..*/.st
11cc0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
11cd0 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
11ce0 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74  ager){..  assert
11cf0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
11d00 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
11d10 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
11d20 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11d30 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20  OPEN .       || 
11d40 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11d50 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29  PAGER_ERROR .  )
11d60 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ;..  sqlite3Bitv
11d70 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
11d80 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
11d90 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
11da0 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nal = 0;.  relea
11db0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11dc0 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
11dd0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
11de0 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
11df0 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
11e00 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73  r->jfd) );.    s
11e10 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
11e20 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
11e30 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70  er->pWal);.    p
11e40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
11e50 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65  PAGER_OPEN;.  }e
11e60 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
11e70 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
11e80 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ea0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
11eb0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61  e returned by pa
11ec0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f  gerUnlockDb() */
11ed0 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69  .    int iDc = i
11ee0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
11ef0 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  )?sqlite3OsDevic
11f00 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
11f10 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a  (pPager->fd):0;.
11f20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
11f30 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
11f40 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e  support deletion
11f50 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20   of open files, 
11f60 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73  then.    ** clos
11f70 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
11f80 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
11f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
11fa0 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20  ck.  Otherwise. 
11fb0 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f     ** another co
11fc0 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
11fd0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
11fe0 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74  e might delete t
11ff0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f  he file.    ** o
12000 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
12010 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
12020 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12030 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20  NALMODE_MEMORY  
12040 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12050 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12060 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
12070 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
12080 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12090 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
120a0 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  L      & 5)!=1 )
120b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
120c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
120d0 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d  _DELETE   & 5)!=
120e0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
120f0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12100 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35  ODE_TRUNCATE & 5
12110 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
12120 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12130 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
12140 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69  & 5)==1 );.    i
12150 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c  f( 0==(iDc & SQL
12160 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
12170 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29  TABLE_WHEN_OPEN)
12180 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61  .     || 1!=(pPa
12190 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
121a0 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20   & 5).    ){.   
121b0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
121c0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
121d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
121e0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
121f0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12200 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f   and the call to
12210 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
12220 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
12230 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20   fails, set the 
12240 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20  current lock to 
12250 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
12260 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20  e the comment.  
12270 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23    ** above the #
12280 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f  define for UNKNO
12290 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
122a0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68  xplanation of wh
122b0 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  y this.    ** is
122c0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
122d0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
122e0 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
122f0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
12300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12310 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  K && pPager->eSt
12320 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
12330 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12340 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57  ->eLock = UNKNOW
12350 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  N_LOCK;.    }.. 
12360 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
12370 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61  state may be cha
12380 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f  nged from PAGER_
12390 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f  ERROR to PAGER_O
123a0 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20  PEN here.    ** 
123b0 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67  without clearing
123c0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e   the error code.
123d0 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69   This is intenti
123e0 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72  onal - the error
123f0 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20  .    ** code is 
12400 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20  cleared and the 
12410 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74  cache reset in t
12420 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a  he block below..
12430 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12440 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12450 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  de || pPager->eS
12460 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
12470 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  R );.    pPager-
12480 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
12490 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
124a0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
124b0 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OPEN;.  }..  /*
124c0 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
124d0 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
124e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
124f0 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
12500 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64   be.  ** trusted
12510 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65  . Now that there
12520 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
12530 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
12540 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a  o the pager,.  *
12550 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20  * it can safely 
12560 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47  move back to PAG
12570 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54  ER_OPEN state. T
12580 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62  his happens in b
12590 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  oth.  ** normal 
125a0 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f  and exclusive-lo
125b0 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f  cking mode..  */
125c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
125d0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61 73  rrCode ){.    as
125e0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
125f0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
12600 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
12610 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
12620 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
12630 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50 61  empFile;.    pPa
12640 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12650 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50  GER_OPEN;.    pP
12660 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
12670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
12680 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
12690 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
126a0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
126b0 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  d, 0, 0);.  }.. 
126c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
126d0 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
126e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
126f0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
12700 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f  Master = 0;.}../
12710 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12720 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
12730 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f  never an IOERR o
12740 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61  r FULL error tha
12750 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68  t requires.** th
12760 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73  e pager to trans
12770 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45  ition into the E
12780 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61  RROR state may a
12790 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  hve occurred..**
127a0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
127b0 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
127c0 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
127d0 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
127e0 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ond .** the erro
127f0 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
12800 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
12810 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
12820 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c  ion. The .** val
12830 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
12840 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
12850 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
12860 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
12870 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
12880 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
12890 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c  SQLITE_FULL, SQL
128a0 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65  ITE_IOERR or one
128b0 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52   of the.** IOERR
128c0 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20   sub-codes, the 
128d0 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
128e0 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64   ERROR state and
128f0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
12900 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
12910 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57  Pager.errCode. W
12920 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72  hile the pager r
12930 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52  emains in the ER
12940 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c  ROR state,.** al
12950 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c  l major API call
12960 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77  s on the Pager w
12970 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
12980 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72  return Pager.err
12990 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Code..**.** The 
129a0 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69  ERROR state indi
129b0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
129c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
129d0 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
129e0 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
129f0 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
12a00 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
12a10 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
12a20 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
12a30 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12a40 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
12a50 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
12a60 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
12a70 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
12a80 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  or occurred, the
12a90 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
12aa0 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
12ab0 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
12ac0 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
12ad0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12ae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
12af0 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65  as if.** it were
12b00 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
12b10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12b20 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
12b30 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
12b40 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
12b50 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
12b60 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
12b70 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  K || !MEMDB );. 
12b80 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20   assert(.       
12b90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
12ba0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
12bb0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
12bc0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
12bd0 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61  K ||.       (pPa
12be0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30  ger->errCode & 0
12bf0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
12c00 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  RR.  );.  if( rc
12c10 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
12c20 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f  | rc2==SQLITE_IO
12c30 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ERR ){.    pPage
12c40 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
12c50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12c60 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f  ate = PAGER_ERRO
12c70 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
12c80 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
12c90 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
12ca0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12cb0 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a  Pgno nPage);../*
12cc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12cd0 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
12ce0 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
12cf0 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
12d00 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
12d10 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
12d20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
12d30 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
12d40 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
12d50 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
12d60 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
12d70 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
12d80 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
12d90 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
12da0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
12db0 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
12dc0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
12dd0 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
12de0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
12df0 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  n..** .** This r
12e00 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
12e10 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f  called in PAGER_
12e20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20  ERROR state. If 
12e30 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  it is called.** 
12e40 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72  in PAGER_NONE or
12e50 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
12e60 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ate and the lock
12e70 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a   held is less.**
12e80 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20   exclusive than 
12e90 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  a RESERVED lock,
12ea0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
12eb0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
12ec0 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
12ed0 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
12ee0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
12ef0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
12f00 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
12f10 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
12f20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
12f30 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
12f40 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
12f50 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
12f60 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
12f70 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
12f80 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
12f90 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
12fa0 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
12fb0 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
12fc0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
12fd0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12fe0 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
12ff0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13000 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
13010 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
13020 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
13030 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
13040 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
13050 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
13060 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
13070 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
13080 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
13090 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
130a0 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
130b0 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
130c0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
130d0 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
130e0 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
130f0 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
13100 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
13110 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
13120 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
13130 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
13140 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
13150 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
13160 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13170 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
13180 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
13190 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
131a0 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
131b0 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
131c0 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
131d0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
131e0 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
131f0 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
13200 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
13210 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
13220 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
13230 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
13240 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
13250 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
13260 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
13270 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
13280 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
13290 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
132a0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
132b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
132c0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
132d0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
132e0 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
132f0 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
13300 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
13310 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
13320 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
13330 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
13340 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
13350 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
13360 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
13370 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
13380 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
13390 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
133a0 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
133b0 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
133c0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
133d0 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
133e0 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  ized, the pager 
133f0 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52  moves to PAGER_R
13400 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20  EADER state..** 
13410 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  If running in no
13420 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c  n-exclusive roll
13430 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c  back mode, the l
13440 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
13450 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65  is .** downgrade
13460 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f  d to a SHARED_LO
13470 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
13480 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
13490 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
134a0 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
134b0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a  occurs during.**
134c0 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f   any of the IO o
134d0 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e  perations to fin
134e0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
134f0 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b  l file or unlock
13500 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
13510 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
13520 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
13530 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
13540 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72   If the .** oper
13550 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a  ation to finaliz
13560 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13570 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  le fails, then t
13580 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a  he code still.**
13590 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b   tries to unlock
135a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
135b0 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63  le if not in exc
135c0 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20  lusive mode. If 
135d0 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70  the.** unlock op
135e0 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73  eration fails as
135f0 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   well, then the 
13600 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65  first error code
13610 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74   related.** to t
13620 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65  he first error e
13630 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20  ncountered (the 
13640 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
13650 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20  tion one) is.** 
13660 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
13670 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
13680 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
13690 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
136a0 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20   hasMaster, int 
136b0 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20  bCommit){.  int 
136c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
136d0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
136e0 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
136f0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
13700 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
13710 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
13720 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
13730 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
13740 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
13750 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
13760 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
13770 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
13780 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
13790 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
137a0 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
137b0 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
137c0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
137d0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
137e0 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
137f0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
13800 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
13810 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
13820 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
13830 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
13840 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
13850 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
13860 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
13870 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
13880 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
13890 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
138a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
138b0 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
138c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
138d0 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
138e0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
138f0 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
13900 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
13910 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
13920 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
13930 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
13940 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
13950 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
13960 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
13970 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13980 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
13990 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
139a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
139b0 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
139c0 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
139d0 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
139e0 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
139f0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
13a00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
13a10 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
13a20 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
13a30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
13a40 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
13a50 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
13a60 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
13a70 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
13a80 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
13a90 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
13aa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13ab0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
13ac0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
13ad0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
13ae0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
13af0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
13b00 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
13b10 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
13b20 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
13b30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
13b40 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
13b50 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
13b60 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13b70 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
13b80 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d  if( sqlite3IsMem
13b90 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
13ba0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
13bb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13bc0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13bd0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
13be0 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ORY );.      sql
13bf0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
13c00 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
13c10 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13c20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13c30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
13c40 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
13c50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13c60 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
13c70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13c80 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
13c90 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13ca0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
13cb0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
13cc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13cd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13ce0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
13cf0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
13d00 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13d10 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
13d20 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
13d30 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
13d40 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
13d50 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
13d60 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13d70 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
13d80 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
13d90 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
13da0 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
13db0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13dc0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
13dd0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
13de0 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
13df0 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
13e00 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
13e10 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
13e20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
13e30 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
13e40 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
13e50 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
13e60 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
13e70 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
13e80 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
13e90 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
13ea0 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
13eb0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
13ec0 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
13ed0 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
13ee0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a  emory journal. .
13ef0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13f00 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 28 21 70  nt bDelete = (!p
13f10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
13f20 26 26 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  && sqlite3Journa
13f30 6c 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  lExists(pPager->
13f40 6a 66 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73  jfd));.      ass
13f50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
13f60 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
13f70 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
13f80 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  TE .           |
13f90 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
13fa0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13fb0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
13fc0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
13fd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13fe0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13ff0 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
14000 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14010 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
14020 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
14030 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20   bDelete ){.    
14040 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14050 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
14060 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
14070 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
14080 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14090 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
140a0 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69  ECK_PAGES.  sqli
140b0 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
140c0 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
140d0 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74  Cache, pager_set
140e0 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66  _pagehash);.  if
140f0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
14100 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63  ==0 && sqlite3Pc
14110 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
14120 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
14130 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20  ){.    PgHdr *p 
14140 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
14150 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69  Pager, 1);.    i
14160 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  f( p ){.      p-
14170 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20  >pageHash = 0;. 
14180 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14190 72 55 6e 72 65 66 28 70 29 3b 0a 20 20 20 20 7d  rUnref(p);.    }
141a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
141b0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
141c0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
141d0 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
141e0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
141f0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
14200 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  c = 0;.  sqlite3
14210 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
14220 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
14230 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
14240 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
14250 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72  >pPCache, pPager
14260 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66  ->dbSize);..  if
14270 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
14280 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
14290 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69  Drop the WAL wri
142a0 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e  te-lock, if any.
142b0 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f   Also, if the co
142c0 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nnection was in 
142d0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f  .    ** locking_
142e0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
142f0 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f  ode but is no lo
14300 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45  nger, drop the E
14310 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a  XCLUSIVE .    **
14320 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
14330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14340 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20  .    */.    rc2 
14350 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57  = sqlite3WalEndW
14360 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  riteTransaction(
14370 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
14380 20 20 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d     assert( rc2==
14390 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
143a0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
143b0 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69  ITE_OK && bCommi
143c0 74 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46  t && pPager->dbF
143d0 69 6c 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e  ileSize>pPager->
143e0 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  dbSize ){.    /*
143f0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
14400 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69  taken when commi
14410 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
14420 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d  ion in rollback-
14430 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d  journal.    ** m
14440 6f 64 65 20 69 66 20 74 68 65 20 64 61 74 61 62  ode if the datab
14450 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
14460 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
14470 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
14480 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68  ge..    ** At th
14490 69 73 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75  is point the jou
144a0 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69  rnal has been fi
144b0 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20  nalized and the 
144c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
144d0 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79   ** successfully
144e0 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20   committed, but 
144f0 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
14500 63 6b 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ck is still held
14510 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
14520 69 6c 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61  ile. So it is sa
14530 66 65 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  fe to truncate t
14540 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14550 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a   to its minimum.
14560 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20      ** required 
14570 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73  size.  */.    as
14580 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
14590 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
145a0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
145b0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
145c0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64  Pager, pPager->d
145d0 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  bSize);.  }..  i
145e0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
145f0 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26  usiveMode .   &&
14600 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70   (!pagerUseWal(p
14610 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65  Pager) || sqlite
14620 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
14630 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
14640 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32  0)).  ){.    rc2
14650 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
14660 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
14670 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
14680 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
14690 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ne = 0;.  }.  pP
146a0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
146b0 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70  AGER_READER;.  p
146c0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
146d0 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
146e0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
146f0 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
14700 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
14710 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
14720 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
14730 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
14740 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
14750 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
14760 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
14770 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
14780 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  OR state, do not
14790 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65   attempt .** the
147a0 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69   rollback at thi
147b0 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c  s time. Instead,
147c0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
147d0 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a  is called. The.*
147e0 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
147f0 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69  unlock() will di
14800 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
14810 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63  ory pages, unloc
14820 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  k.** the databas
14830 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20  e file and move 
14840 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
14850 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66  o OPEN state. If
14860 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20   this .** means 
14870 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
14880 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  hot-journal left
14890 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
148a0 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a  tem, the next .*
148b0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * connection to 
148c0 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
148d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
148e0 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  r (which may be 
148f0 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69  this one) .** wi
14900 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ll roll it back.
14910 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14920 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
14930 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
14940 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74  ERROR state, but
14950 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
14960 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
14970 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
14980 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
14990 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
149a0 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
149b0 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
149c0 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
149d0 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
149e0 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
149f0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
14a00 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
14a10 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
14a20 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
14a30 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
14a40 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
14a50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
14a60 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
14a70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
14a80 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
14a90 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
14aa0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
14ab0 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  er) );.    if( p
14ac0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
14ad0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
14ae0 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ED ){.      sqli
14af0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
14b00 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71  lloc();.      sq
14b10 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
14b20 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14b30 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
14b40 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
14b50 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
14b60 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14b70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14b80 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14b90 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
14ba0 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e  ;.      pager_en
14bb0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
14bc0 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ager, 0, 0);.   
14bd0 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75   }.  }.  pager_u
14be0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
14bf0 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
14c00 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69  r aData must poi
14c10 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
14c20 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  f pPager->pageSi
14c30 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  ze bytes.** of d
14c40 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64  ata. Compute and
14c50 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
14c60 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65  um based ont the
14c70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
14c80 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74   .** page of dat
14c90 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  a and the curren
14ca0 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65  t value of pPage
14cb0 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a  r->cksumInit..**
14cc0 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
14cd0 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
14ce0 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
14cf0 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
14d00 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
14d10 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67  tial value (pPag
14d20 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61  er->cksumInit) a
14d30 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62  nd every 200th b
14d40 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  yte.** of the pa
14d50 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e  ge data, startin
14d60 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73  g with byte offs
14d70 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  et (pPager->page
14d80 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61  Size%200)..** Ea
14d90 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
14da0 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62  preted as an 8-b
14db0 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  it unsigned inte
14dc0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  ger..**.** Chang
14dd0 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20  ing the formula 
14de0 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
14df0 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65  this checksum re
14e00 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69  sults in an.** i
14e10 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72  ncompatible jour
14e20 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  nal file format.
14e30 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61  .**.** If journa
14e40 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  l corruption occ
14e50 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
14e60 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
14e70 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20  most likely .** 
14e80 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74  scenario is that
14e90 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
14ea0 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
14eb0 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
14ec0 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d  ged. .** It is m
14ed0 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
14ee0 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
14ef0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
14f00 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
14f10 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
14f20 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
14f30 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
14f40 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
14f50 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
14f60 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
14f70 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
14f80 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
14f90 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  f corruption..*/
14fa0 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
14fb0 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
14fc0 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
14fd0 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
14fe0 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
14ff0 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
15000 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61    /* Checksum va
15010 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
15020 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
15030 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
15040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
15050 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77  p counter */.  w
15060 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20  hile( i>0 ){.   
15070 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b   cksum += aData[
15080 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30  i];.    i -= 200
15090 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
150a0 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ksum;.}../*.** R
150b0 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e  eport the curren
150c0 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
150d0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
150e0 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a  ed bytes back.**
150f0 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a   to the codec..*
15100 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
15110 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63  HAS_CODEC.static
15120 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72   void pagerRepor
15130 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  tSize(Pager *pPa
15140 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
15150 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
15160 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ng ){.    pPager
15170 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
15180 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c  (pPager->pCodec,
15190 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
151a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
151c0 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  nt)pPager->nRese
151d0 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  rve);.  }.}.#els
151e0 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
151f0 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20  ReportSize(X)   
15200 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65    /* No-op if we
15210 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
15220 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69  a codec */.#endi
15230 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
15240 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
15250 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
15260 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
15270 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
15280 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
15290 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
152a0 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
152b0 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
152c0 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
152d0 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
152e0 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
152f0 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
15300 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
15310 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
15320 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
15330 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
15340 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
15350 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
15360 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65  journal uses che
15370 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
15380 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
15390 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a  oes .** not..**.
153a0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
153b0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
153c0 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
153d0 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
153e0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
153f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
15400 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
15410 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
15420 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
15430 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
15440 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
15450 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
15460 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
15470 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
15480 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
15490 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
154a0 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
154b0 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
154c0 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
154d0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
154e0 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
154f0 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
15500 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
15510 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
15520 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
15530 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
15540 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
15550 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
15560 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
15570 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
15580 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
15590 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
155a0 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
155b0 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
155c0 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
155d0 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
155e0 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
155f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
15600 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
15610 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
15620 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
15630 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
15640 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
15650 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
15660 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
15670 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
15680 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
15690 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
156a0 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
156b0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
156c0 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
156d0 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
156e0 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
156f0 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
15700 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
15710 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
15720 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
15730 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
15740 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
15750 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
15760 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
15770 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
15780 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
15790 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
157a0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
157b0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
157c0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
157d0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
157e0 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
157f0 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
15800 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
15810 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
15820 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
15830 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
15840 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
15850 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
15860 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
15870 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
15880 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15890 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
158a0 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
158b0 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
158c0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
158d0 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
158e0 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
158f0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
15900 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
15910 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
15920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15930 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
15940 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
15950 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
15960 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15970 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
15980 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34  ed back */.  i64
15990 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
159a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
159b0 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
159c0 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
159d0 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20  Bitvec *pDone,  
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
159f0 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
15a00 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
15a10 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73  back */.  int is
15a20 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20  MainJrnl,       
15a30 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20          /* 1 -> 
15a40 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20  main journal. 0 
15a50 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  -> sub-journal. 
15a60 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
15a70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
15a80 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
15a90 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
15aa0 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ack */.){.  int 
15ab0 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
15ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15ad0 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
15ae0 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
15af0 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
15b00 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
15b10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
15b20 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
15b30 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
15b40 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b60 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
15b70 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
15b80 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61  hecking */.  cha
15b90 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  r *aData;       
15ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
15bb0 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
15bc0 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
15bd0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
15be0 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  jfd;            
15bf0 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
15c00 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  riptor for the j
15c10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
15c20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20   int isSynced;  
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15c40 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
15c50 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65 64  l page is synced
15c60 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
15c70 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
15c80 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
15c90 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
15ca0 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
15cb0 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
15cc0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
15cd0 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
15ce0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
15cf0 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
15d00 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
15d10 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
15d20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
15d30 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
15d40 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
15d50 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
15d60 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
15d70 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
15d80 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d   aData = pPager-
15d90 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73  >pTmpSpace;.  as
15da0 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20  sert( aData );  
15db0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
15dc0 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65  torage must have
15dd0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
15de0 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73  located */.  ass
15df0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
15e00 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28  (pPager)==0 || (
15e10 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69  !isMainJrnl && i
15e20 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20  sSavepnt) );..  
15e30 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74  /* Either the st
15e40 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ate is greater t
15e50 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52  han PAGER_WRITER
15e60 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61  _CACHEMOD (a tra
15e70 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
15e80 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  r savepoint roll
15e90 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65  back done at the
15ea0 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20   request of the 
15eb0 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20  caller) or this 
15ec0 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  is.  ** a hot-jo
15ed0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
15ee0 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a  If it is a hot-j
15ef0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
15f00 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
15f10 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e  is in state OPEN
15f20 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58   and holds an EX
15f30 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f  CLUSIVE lock. Ho
15f40 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
15f50 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61  ck.  ** only rea
15f60 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
15f70 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68   journal, not th
15f80 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
15f90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
15fa0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
15fb0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
15fc0 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  MOD.       || (p
15fd0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
15fe0 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61  AGER_OPEN && pPa
15ff0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
16000 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
16010 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16020 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
16030 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
16040 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29   || isMainJrnl )
16050 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
16060 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
16070 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20   page data from 
16080 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  the journal or s
16090 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  ub-journal.  ** 
160a0 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20  file. Return an 
160b0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
160c0 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49  e caller if an I
160d0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  O error occurs..
160e0 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d    */.  jfd = isM
160f0 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
16100 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
16110 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61  sjfd;.  rc = rea
16120 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f  d32bits(jfd, *pO
16130 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
16140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16150 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
16160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16170 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61  Read(jfd, (u8*)a
16180 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
16190 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
161a0 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
161b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
161c0 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
161d0 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
161e0 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
161f0 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
16200 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
16210 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
16220 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
16230 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
16240 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
16250 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
16260 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
16270 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
16280 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
16290 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
162a0 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
162b0 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
162c0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
162d0 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
162e0 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
162f0 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
16300 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
16310 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
16320 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
16330 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
16340 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
16350 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
16360 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
16370 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
16380 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
16390 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
163a0 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
163b0 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
163c0 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
163d0 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
163e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
163f0 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
16400 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
16410 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
16420 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
16430 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
16440 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
16450 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
16460 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
16470 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74  Pager, (u8*)aDat
16480 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
16490 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
164a0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
164b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
164c0 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
164d0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62  been played by b
164e0 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65  efore during the
164f0 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f   current.  ** ro
16500 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e  llback, then don
16510 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61  't bother to pla
16520 79 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e  y it back again.
16530 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e  .  */.  if( pDon
16540 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
16550 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e  e3BitvecSet(pDon
16560 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54  e, pgno))!=SQLIT
16570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
16580 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
16590 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61   When playing ba
165a0 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f  ck page 1, resto
165b0 72 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20  re the nReserve 
165c0 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69  setting.  */.  i
165d0 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  f( pgno==1 && pP
165e0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d  ager->nReserve!=
165f0 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
16600 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
16610 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a  nReserve = ((u8*
16620 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20  )aData)[20];.   
16630 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16640 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
16650 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
16660 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20   is in CACHEMOD 
16670 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
16680 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
16690 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
166a0 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
166b0 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
166c0 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
166d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
166e0 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
166f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
16700 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
16710 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
16720 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
16730 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  ** An exception 
16740 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c  to the above rul
16750 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e: If the databa
16760 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  se is in no-sync
16770 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61   mode.  ** and a
16780 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64   page is moved d
16790 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  uring an increme
167a0 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e  ntal vacuum then
167b0 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20   the page may.  
167c0 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ** not be in the
167d0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61   pager cache. La
167e0 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63  ter: if a malloc
167f0 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f  () or IO error o
16800 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
16810 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63  g a Movepage() c
16820 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61  all, then the pa
16830 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ge may not be in
16840 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20   the cache.  ** 
16850 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63  either. So the c
16860 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
16870 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  ed in the above 
16880 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74  paragraph is not
16890 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62  .  ** assert()ab
168a0 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
168b0 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44   in WRITER_DBMOD
168c0 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  , WRITER_FINISHE
168d0 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c  D or OPEN state,
168e0 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
168f0 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63  the.  ** pager c
16900 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
16910 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  s and the main f
16920 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
16930 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20   then marked .  
16940 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69  ** not dirty. Si
16950 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73  nce this code is
16960 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69   only executed i
16970 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
16980 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f  te for.  ** a ho
16990 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
169a0 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  ck, it is guaran
169b0 74 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61  teed that the pa
169c0 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74  ge-cache is empt
169d0 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61  y.  ** if the pa
169e0 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73  ger is in OPEN s
169f0 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tate..  **.  ** 
16a00 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
16a10 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
16a20 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
16a30 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
16a40 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
16a50 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
16a60 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
16a70 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
16a80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
16a90 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
16aa0 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
16ab0 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
16ac0 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
16ad0 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
16ae0 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
16af0 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
16b00 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
16b10 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
16b20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
16b30 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
16b40 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
16b50 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
16b60 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
16b70 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
16b80 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
16b90 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
16ba0 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
16bb0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
16bc0 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
16bd0 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
16be0 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
16bf0 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
16c00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
16c10 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
16c20 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
16c30 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
16c40 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
16c50 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
16c60 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
16c70 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
16c80 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
16c90 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
16ca0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
16cb0 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
16cc0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
16cd0 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
16ce0 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
16cf0 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
16d00 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
16d10 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
16d20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
16d30 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
16d40 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
16d50 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
16d60 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
16d70 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
16d80 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
16d90 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
16da0 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
16db0 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
16dc0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
16dd0 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
16de0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
16df0 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
16e00 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
16e10 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
16e20 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
16e30 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
16e40 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
16e50 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
16e60 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
16e70 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  /.  if( pagerUse
16e80 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
16e90 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
16ea0 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  lse{.    pPg = p
16eb0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
16ec0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  er, pgno);.  }. 
16ed0 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20   assert( pPg || 
16ee0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
16ef0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
16f00 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te!=PAGER_OPEN |
16f10 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41  | pPg==0 );.  PA
16f20 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
16f30 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
16f40 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
16f50 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
16f60 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
16f70 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
16f80 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
16f90 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
16fa0 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
16fb0 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
16fc0 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
16fd0 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
16fe0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
16ff0 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70      isSynced = p
17000 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
17010 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50   (*pOffset <= pP
17020 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17030 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17040 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d  isSynced = (pPg=
17050 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
17060 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
17070 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20  D_SYNC));.  }.  
17080 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
17090 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50  r->fd).   && (pP
170a0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
170b0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
170c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
170d0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
170e0 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20     && isSynced. 
170f0 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
17100 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
17110 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
17120 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
17130 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
17140 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66  Pg!=0 && (pPg->f
17150 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
17160 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20  SYNC)!=0 );.    
17170 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
17180 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
17190 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
171a0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
171b0 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c  fd, (u8 *)aData,
171c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
171d0 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66  e, ofst);.    if
171e0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
171f0 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
17200 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
17210 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
17220 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
17230 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20  er->pBackup ){. 
17240 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
17250 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
17260 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
17270 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  MEM);.      sqli
17280 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
17290 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
172a0 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74   pgno, (u8*)aDat
172b0 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32  a);.      CODEC2
172c0 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
172d0 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49  pgno, 7, rc=SQLI
172e0 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29  TE_NOMEM, aData)
172f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
17300 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  if( !isMainJrnl 
17310 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  && pPg==0 ){.   
17320 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
17330 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73   rollback of a s
17340 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74  avepoint and dat
17350 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65  a was not writte
17360 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  n to.    ** the 
17370 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
17380 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d   page is not in-
17390 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73  memory, there is
173a0 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20   a potential.   
173b0 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65   ** problem. Whe
173c0 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65  n the page is ne
173d0 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68  xt fetched by th
173e0 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20  e b-tree layer, 
173f0 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
17400 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
17410 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
17420 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
17430 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20   not be .    ** 
17440 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a  current. .    **
17450 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
17460 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69  e a couple of di
17470 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69  fferent ways thi
17480 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c  s can happen. Al
17490 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20  l are quite.    
174a0 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e  ** obscure. When
174b0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63   running in sync
174c0 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68  hronous mode, th
174d0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
174e0 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  en .    ** if th
174f0 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65  e page is on the
17500 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68   free-list at th
17510 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
17520 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
17530 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  .    ** populate
17540 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73  d, then moved us
17550 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
17560 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20  Movepage()..    
17570 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
17580 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64  lution is to add
17590 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
175a0 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20  ge to the cache 
175b0 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a  containing.    *
175c0 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20  * the data just 
175d0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75  read from the su
175e0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20  b-journal. Mark 
175f0 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
17600 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66  y .    ** and if
17610 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69   the pager requi
17620 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  res a journal-sy
17630 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68  nc, then mark th
17640 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a  e page as .    *
17650 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f  * requiring a jo
17660 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72  urnal-sync befor
17670 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e  e it is written.
17680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
17690 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b  rt( isSavepnt );
176a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
176b0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
176c0 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
176d0 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20  LBACK)==0 );.   
176e0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
176f0 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
17700 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72  _ROLLBACK;.    r
17710 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17720 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
17730 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a  pgno, &pPg, 1);.
17740 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
17750 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
17760 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  & SPILLFLAG_ROLL
17770 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20  BACK)!=0 );.    
17780 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
17790 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47  ll &= ~SPILLFLAG
177a0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69  _ROLLBACK;.    i
177b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
177c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
177d0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
177e0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
177f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
17800 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
17810 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
17820 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
17830 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
17840 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
17850 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
17860 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
17870 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
17880 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
17890 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
178a0 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
178b0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
178c0 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
178d0 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
178e0 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
178f0 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
17900 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
17910 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
17920 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
17930 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
17940 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
17950 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
17960 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
17970 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
17980 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
17990 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
179a0 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
179b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
179c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
179d0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
179e0 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
179f0 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
17a00 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
17a10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
17a20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17a30 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17a40 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
17a50 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
17a60 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
17a70 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
17a80 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
17a90 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
17aa0 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
17ab0 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
17ac0 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
17ad0 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
17ae0 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
17af0 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
17b00 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
17b10 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
17b20 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
17b30 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
17b40 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17b50 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
17b60 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
17b70 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
17b80 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
17b90 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
17ba0 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
17bb0 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
17bc0 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
17bd0 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
17be0 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
17bf0 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
17c00 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
17c10 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
17c20 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
17c30 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
17c40 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17c50 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
17c60 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
17c70 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
17c80 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
17c90 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
17ca0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
17cb0 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
17cc0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
17cd0 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
17ce0 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
17cf0 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
17d00 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
17d10 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17d20 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
17d30 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
17d40 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
17d50 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
17d60 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
17d70 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
17d80 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
17d90 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
17da0 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
17db0 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
17dc0 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
17dd0 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
17de0 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
17df0 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
17e00 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17e10 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
17e20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
17e30 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
17e40 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
17e50 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
17e60 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
17e70 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
17e80 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
17e90 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
17ea0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
17eb0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
17ec0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
17ed0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17ee0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
17ef0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
17f00 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
17f10 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
17f20 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
17f30 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
17f40 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
17f50 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
17f60 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
17f70 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
17f80 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
17f90 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
17fa0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
17fb0 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
17fc0 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
17fd0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
17fe0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
17ff0 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
18000 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
18010 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
18020 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
18030 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
18040 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
18050 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
18060 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
18070 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
18080 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
18090 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
180a0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
180b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
180c0 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
180d0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
180e0 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
180f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18100 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
18110 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
18120 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
18130 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
18140 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
18150 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
18160 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
18170 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
18180 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
18190 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
181a0 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
181b0 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
181c0 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
181d0 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
181e0 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
181f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
18200 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
18210 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18220 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
18230 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
18240 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
18250 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
18260 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
18270 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
18280 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
18290 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
182a0 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
182b0 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
182c0 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
182d0 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
182e0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
182f0 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
18300 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
18310 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
18320 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
18330 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
18340 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
18350 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
18360 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
18370 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
18380 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
18390 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
183a0 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
183b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
183c0 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
183d0 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
183e0 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
183f0 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
18400 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
18410 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18420 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
18430 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
18440 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
18450 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
18460 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
18470 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
18480 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
18490 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
184a0 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
184b0 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
184c0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
184d0 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
184e0 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
184f0 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
18500 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
18510 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18520 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
18530 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
18540 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
18550 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
18560 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
18570 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
18580 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
18590 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
185a0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
185b0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
185c0 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
185d0 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
185e0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
185f0 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
18600 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
18610 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
18620 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
18630 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
18640 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
18650 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
18660 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
18670 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18680 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
18690 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
186a0 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
186b0 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
186c0 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
186d0 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
186e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
186f0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
18700 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
18710 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
18720 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
18730 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18740 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
18750 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
18760 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
18770 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
18780 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
18790 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
187a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
187b0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
187c0 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
187d0 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
187e0 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
187f0 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
18800 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
18810 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
18820 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
18830 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18840 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
18850 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
18860 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
18870 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
18880 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18890 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
188a0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
188b0 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
188c0 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
188d0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
188e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
188f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
18900 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
18910 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
18920 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18930 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
18940 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
18950 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
18960 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
18970 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18980 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
18990 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
189a0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
189b0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
189c0 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
189d0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
189e0 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
189f0 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
18a00 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
18a10 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18a20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
18a30 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
18a40 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
18a50 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
18a60 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
18a70 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
18a80 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
18a90 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
18aa0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
18ab0 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
18ac0 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
18ad0 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
18ae0 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
18af0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
18b00 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
18b10 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
18b20 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
18b30 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
18b40 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
18b50 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
18b60 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
18b70 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
18b80 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
18b90 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
18ba0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
18bb0 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
18bc0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18bd0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
18be0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
18bf0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
18c00 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
18c10 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
18c20 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
18c30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18c40 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
18c50 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
18c60 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
18c70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18c80 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18c90 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
18ca0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
18cb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
18cc0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
18cd0 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
18ce0 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
18cf0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
18d00 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
18d10 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
18d20 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
18d30 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
18d40 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
18d50 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
18d60 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
18d70 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
18d80 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
18d90 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
18da0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18db0 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
18dc0 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
18dd0 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
18de0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18df0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18e00 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
18e10 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
18e20 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
18e30 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
18e40 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
18e50 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
18e60 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
18e70 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
18e80 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18e90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
18ea0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18eb0 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
18ec0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
18ed0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
18ee0 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
18ef0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
18f00 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
18f10 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
18f20 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
18f30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18f40 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18f50 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
18f60 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
18f70 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
18f80 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
18f90 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
18fa0 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
18fb0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
18fc0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
18fd0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
18fe0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18ff0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
19000 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
19010 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
19020 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
19030 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19040 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
19050 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19060 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
19070 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
19080 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
19090 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
190a0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
190b0 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
190c0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
190d0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
190e0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
190f0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
19100 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
19110 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
19120 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
19130 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
19140 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
19150 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
19160 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
19170 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
19180 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
19190 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
191a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
191b0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
191c0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
191d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
191e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
191f0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19200 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19210 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
19220 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
19230 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
19240 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
19250 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
19260 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
19270 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19290 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
192a0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
192b0 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
192c0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
192d0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
192e0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
192f0 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
19300 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
19310 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
19320 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
19330 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19340 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
19350 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19370 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
19380 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19390 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
193a0 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
193b0 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
193c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
193d0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
193e0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
193f0 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
19400 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
19410 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
19420 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
19430 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19440 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
19450 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
19460 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
19470 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
19480 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19490 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
194a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
194b0 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
194c0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
194d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
194e0 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
194f0 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
19500 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
19510 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
19520 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
19530 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
19540 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
19550 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
19560 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
19570 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
19580 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
19590 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
195a0 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
195b0 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
195c0 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
195d0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
195e0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
195f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
19600 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
19610 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
19620 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
19630 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
19640 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
19650 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19660 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
19670 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
19680 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
19690 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
196a0 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
196b0 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
196c0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
196d0 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
196e0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
196f0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
19700 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
19710 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
19720 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
19730 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
19740 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
19750 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
19760 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
19770 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
19780 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
19790 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
197a0 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
197b0 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
197c0 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
197d0 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
197e0 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
197f0 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
19800 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
19810 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
19820 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
19830 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
19840 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
19850 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
19860 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
19870 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
19880 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
19890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
198a0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
198b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
198c0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
198d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
198e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
198f0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
19900 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
19910 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19920 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
19930 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
19940 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
19950 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
19960 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
19970 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
19980 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
19990 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
199a0 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
199b0 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
199c0 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
199d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
199e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
199f0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
19a00 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
19a10 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19a20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19a30 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19a40 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
19a50 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19a60 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
19a70 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
19a80 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
19a90 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
19aa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19ab0 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
19ac0 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
19ad0 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
19ae0 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
19af0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19b00 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
19b10 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19b20 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
19b30 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
19b40 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
19b50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
19b60 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
19b70 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
19b80 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
19b90 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
19ba0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19bb0 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
19bc0 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
19bd0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
19be0 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
19bf0 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
19c00 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
19c10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19c20 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
19c30 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
19c40 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
19c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19c60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19c70 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
19c80 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
19c90 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
19ca0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19cb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19cc0 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64  turn a sanitized
19cd0 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
19ce0 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f  sector-size of O
19cf0 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68  S file pFile. Th
19d00 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
19d10 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
19d20 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33  to lie between 3
19d30 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52  2 and MAX_SECTOR
19d40 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _SIZE..*/.int sq
19d50 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
19d60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
19d70 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74  ile){.  int iRet
19d80 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
19d90 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20  orSize(pFile);. 
19da0 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a   if( iRet<32 ){.
19db0 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a      iRet = 512;.
19dc0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74    }else if( iRet
19dd0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
19de0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19df0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
19e00 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74  =512 );.    iRet
19e10 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
19e20 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
19e30 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iRet;.}../*.** 
19e40 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
19e50 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
19e60 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
19e70 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
19e80 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
19e90 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
19ea0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
19eb0 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
19ec0 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
19ed0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
19ee0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
19ef0 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
19f00 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
19f10 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
19f20 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
19f30 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
19f40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
19f50 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
19f60 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
19f70 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
19f80 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
19f90 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
19fa0 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
19fb0 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
19fc0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
19fd0 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
19fe0 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
19ff0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a000 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
1a010 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1a020 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
1a030 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
1a040 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
1a050 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
1a060 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
1a070 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
1a080 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
1a090 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
1a0a0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a  _SECTOR_SIZE..**
1a0b0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1a0c0 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49  has the SQLITE_I
1a0d0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1a0e0 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74  VERWRITE propert
1a0f0 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74  y, then set.** t
1a100 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a110 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20  tor size to its 
1a120 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35  minimum value (5
1a130 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73  12).  The purpos
1a140 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  e of.** pPager->
1a150 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f  sectorSize is to
1a160 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61   define the "bla
1a170 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79  st radius" of by
1a180 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  tes that.** migh
1a190 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72  t change if a cr
1a1a0 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ash occurs while
1a1b0 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69   writing to a si
1a1c0 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20  ngle byte in.** 
1a1d0 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74  that range.  But
1a1e0 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f   with POWERSAFE_
1a1f0 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62  OVERWRITE, the b
1a200 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a  last radius is z
1a210 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20  ero.** (that is 
1a220 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f  what POWERSAFE_O
1a230 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c  VERWRITE means),
1a240 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20   so we minimize 
1a250 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69  the sector.** si
1a260 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72  ze.  For backwar
1a270 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
1a280 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1a290 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1a2a0 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e  rmat,.** we cann
1a2b0 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66  ot reduce the ef
1a2c0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a2d0 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a  ize below 512..*
1a2e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1a2f0 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
1a300 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
1a310 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1a320 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1a330 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a340 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
1a350 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73  empFile.   || (s
1a360 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1a370 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1a380 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20  ager->fd) & .   
1a390 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1a3a0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1a3b0 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a  E_OVERWRITE)!=0.
1a3c0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74    ){.    /* Sect
1a3d0 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
1a3e0 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
1a3f0 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
1a400 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
1a410 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
1a420 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
1a430 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
1a440 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
1a450 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
1a460 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20  l segfault. */. 
1a470 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1a480 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
1a490 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
1a4a0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
1a4b0 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1a4c0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1a4d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
1a4e0 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
1a4f0 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
1a500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a510 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
1a520 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
1a530 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
1a540 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
1a550 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
1a560 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
1a570 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
1a580 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
1a590 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
1a5a0 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
1a5b0 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
1a5c0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1a5d0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1a5e0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a5f0 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
1a600 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
1a610 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
1a620 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
1a630 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
1a640 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
1a650 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
1a660 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
1a670 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
1a680 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
1a690 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a6a0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a6b0 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
1a6c0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
1a6d0 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
1a6e0 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
1a6f0 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
1a700 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a710 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
1a720 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
1a730 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
1a740 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
1a750 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
1a760 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1a770 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1a780 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
1a790 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
1a7a0 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
1a7b0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1a7c0 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
1a7d0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1a7e0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
1a7f0 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
1a800 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
1a810 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
1a820 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
1a830 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
1a840 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
1a850 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
1a860 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
1a870 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
1a880 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
1a890 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1a8a0 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
1a8b0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
1a8c0 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
1a8d0 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
1a8e0 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
1a8f0 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
1a900 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
1a910 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
1a920 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
1a930 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
1a940 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
1a950 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
1a960 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
1a970 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
1a980 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
1a990 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
1a9a0 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
1a9b0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1a9c0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
1a9d0 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
1a9e0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1a9f0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
1aa00 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
1aa10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1aa20 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
1aa30 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
1aa40 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
1aa50 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1aa60 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
1aa70 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
1aa80 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
1aa90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1aaa0 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
1aab0 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
1aac0 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
1aad0 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
1aae0 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
1aaf0 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
1ab00 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
1ab10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1ab20 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
1ab30 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
1ab40 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
1ab50 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
1ab60 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
1ab70 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
1ab80 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
1ab90 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1aba0 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
1abb0 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
1abc0 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
1abd0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
1abe0 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
1abf0 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
1ac00 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
1ac10 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
1ac20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
1ac30 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
1ac40 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
1ac50 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
1ac60 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
1ac70 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
1ac80 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
1ac90 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
1aca0 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
1acb0 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
1acc0 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
1acd0 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
1ace0 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
1acf0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1ad00 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
1ad10 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1ad20 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1ad30 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1ad40 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
1ad50 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
1ad60 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
1ad70 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1ad80 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
1ad90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1ada0 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
1adb0 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
1adc0 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
1add0 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
1ade0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
1adf0 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
1ae00 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
1ae10 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
1ae20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
1ae30 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
1ae40 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
1ae50 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
1ae60 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
1ae70 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1ae80 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1ae90 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
1aea0 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1aeb0 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
1aec0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1aed0 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
1aee0 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
1aef0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
1af00 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
1af10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
1af20 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
1af30 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
1af40 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
1af50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1af60 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
1af70 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
1af80 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
1af90 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
1afa0 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
1afb0 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
1afc0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
1afd0 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
1afe0 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
1aff0 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
1b000 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1b010 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
1b020 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
1b030 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1b040 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1b050 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
1b060 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1b070 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1b080 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1b090 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1b0a0 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1b0b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b0c0 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
1b0d0 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1b0e0 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
1b0f0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1b100 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1b110 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
1b120 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1b130 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
1b140 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
1b150 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
1b160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b170 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1b180 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
1b190 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
1b1a0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1b1b0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1b1c0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
1b1d0 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
1b1e0 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
1b1f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b200 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1b210 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
1b220 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
1b230 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
1b240 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
1b250 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
1b260 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ge rollback */. 
1b270 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d   int nPlayback =
1b280 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74   0;       /* Tot
1b290 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1b2a0 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  es restored from
1b2b0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f   journal */..  /
1b2c0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1b2d0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1b2e0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1b2f0 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1b300 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1b310 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1b320 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1b330 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1b340 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b350 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1b360 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1b370 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b380 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1b390 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b3a0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1b3b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b3c0 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1b3d0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1b3e0 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1b3f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b400 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1b410 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1b420 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1b430 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1b440 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1b450 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1b460 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1b470 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1b480 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1b490 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1b4a0 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1b4b0 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1b4c0 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1b4d0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1b4e0 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1b4f0 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1b500 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1b510 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1b520 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1b530 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1b540 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1b550 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1b560 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1b570 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1b580 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1b590 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1b5a0 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1b5b0 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1b5c0 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1b5d0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1b5e0 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1b5f0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1b600 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1b610 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1b620 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1b630 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1b640 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1b650 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1b660 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1b670 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1b680 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1b690 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1b6a0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1b6b0 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1b6c0 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1b6d0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1b6e0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1b6f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b700 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1b710 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1b720 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1b730 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1b740 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1b750 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1b760 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1b770 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1b780 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1b790 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1b7a0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1b7b0 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1b7c0 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1b7d0 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1b7e0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1b7f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b800 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1b810 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1b820 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1b830 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b840 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1b850 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1b860 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1b870 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1b880 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1b890 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1b8a0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1b8b0 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1b8c0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1b8d0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1b8e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1b8f0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1b900 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1b910 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1b920 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1b930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1b940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b950 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1b960 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b970 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1b980 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b990 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1b9a0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1b9b0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1b9c0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1b9d0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1b9e0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1b9f0 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1ba00 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1ba10 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1ba20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1ba30 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1ba40 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1ba50 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1ba60 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1ba70 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1ba80 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1ba90 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1baa0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1bab0 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1bac0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1bad0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bae0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1baf0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1bb00 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1bb10 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1bb20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1bb30 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1bb40 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1bb50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1bb60 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1bb70 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1bb80 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1bb90 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1bba0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1bbb0 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1bbc0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1bbd0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1bbe0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1bbf0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1bc00 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1bc10 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1bc20 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1bc30 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1bc40 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1bc50 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1bc60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1bc70 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1bc80 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1bc90 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1bca0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1bcb0 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1bcc0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1bcd0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1bce0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1bcf0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1bd00 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1bd10 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1bd20 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1bd30 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1bd40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1bd50 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1bd60 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1bd70 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1bd80 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1bd90 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1bda0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1bdb0 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1bdc0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1bdd0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1bde0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1bdf0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1be00 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1be10 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1be20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1be30 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1be40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1be50 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1be60 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1be70 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1be80 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1be90 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1bea0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1beb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1bec0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1bed0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1bee0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1bef0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1bf00 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1bf10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bf20 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1bf30 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1bf40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1bf50 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1bf60 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1bf70 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1bf80 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1bf90 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1bfa0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1bfb0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1bfc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1bfd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1bfe0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1bff0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1c000 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1c010 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1c020 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1c030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c040 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1c050 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1c060 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1c070 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1c080 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1c090 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1c0a0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1c0b0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1c0c0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1c0d0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1c0e0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1c0f0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1c100 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1c110 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1c120 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1c130 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1c140 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1c150 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1c160 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1c170 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1c180 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1c190 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1c1a0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1c1b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1c1c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c1d0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b        nPlayback+
1c1e0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
1c1f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1c200 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1c210 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c220 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1c230 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1c240 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1c250 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1c260 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c270 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1c280 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c290 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1c2a0 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1c2b0 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1c2c0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1c2d0 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1c2e0 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1c2f0 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1c300 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1c310 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1c320 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1c330 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1c340 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1c350 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1c360 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1c370 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1c380 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1c390 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1c3a0 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1c3b0 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1c3c0 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1c3d0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1c3e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1c3f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1c400 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c410 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1c420 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1c430 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1c440 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1c450 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1c460 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1c470 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1c480 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1c490 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1c4a0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1c4b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1c4c0 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1c4d0 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1c4e0 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1c4f0 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1c500 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1c510 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1c520 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1c530 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1c540 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1c550 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1c560 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1c570 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c580 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1c590 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1c5a0 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1c5b0 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1c5c0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1c5d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c5e0 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1c5f0 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1c600 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1c610 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1c620 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1c630 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1c640 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1c650 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1c660 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1c670 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1c680 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1c690 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1c6a0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1c6b0 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1c6c0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1c6d0 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67  DEBUG.  if( pPag
1c6e0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1c6f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
1c700 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
1c710 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
1c720 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1c730 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65  ANGED,0);.  }.#e
1c740 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1c750 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1c760 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1c770 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1c780 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1c790 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1c7a0 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1c7b0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1c7c0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1c7d0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1c7e0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1c7f0 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1c800 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1c810 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1c820 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1c830 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1c840 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1c850 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1c860 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1c870 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1c880 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1c890 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1c8a0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1c8b0 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1c8c0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1c8d0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1c8e0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1c8f0 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1c900 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1c910 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1c920 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1c930 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1c940 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1c950 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1c960 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1c970 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1c980 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1c990 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1c9a0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1c9b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1c9c0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1c9d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1c9e0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1c9f0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1ca00 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1ca10 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1ca20 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1ca30 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1ca40 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1ca50 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1ca60 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1ca70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ca80 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1ca90 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1caa0 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1cab0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1cac0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1cad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1cae0 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 29  agerSync(pPager)
1caf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1cb00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cb10 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1cb20 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1cb30 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1cb40 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1cb50 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1cb60 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1cb70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cb80 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1cb90 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1cba0 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1cbb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1cbc0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1cbd0 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1cbe0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1cbf0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1cc00 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1cc10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1cc20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1cc30 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1cc40 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1cc50 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1cc60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1cc70 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1cc80 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1cc90 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1cca0 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1ccb0 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1ccc0 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1ccd0 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1ccf0 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1cd00 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1cd10 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1cd20 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1cd30 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1cd40 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1cd50 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1cd60 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1cd70 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1cd80 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1cd90 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1cda0 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1cdb0 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1cdc0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1cdd0 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1cde0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1cdf0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1ce00 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1ce10 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1ce20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1ce30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ce40 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
1ce50 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
1ce60 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
1ce70 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
1ce80 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1ce90 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
1cea0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1ceb0 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1cec0 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
1ced0 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
1cee0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
1cef0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
1cf00 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
1cf10 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1cf20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1cf30 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
1cf40 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1cf50 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
1cf60 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1cf70 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
1cf80 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1cf90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1cfa0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1cfb0 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
1cfc0 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a  g, u32 iFrame){.
1cfd0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1cfe0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1cff0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1d000 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1d010 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
1d020 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
1d030 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
1d040 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
1d050 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1d060 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1d070 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1d080 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1d090 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1d0a0 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1d0b0 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1d0c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1d0d0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1d0e0 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1d0f0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1d100 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1d110 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  fd) );..#ifndef 
1d120 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1d130 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a    if( iFrame ){.
1d140 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
1d150 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
1d160 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
1d170 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
1d180 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1d190 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1d1a0 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a  al, iFrame, pgsz
1d1b0 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
1d1c0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1d1d0 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1d1e0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1d1f0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1d200 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
1d210 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1d220 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1d230 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74  a, pgsz, iOffset
1d240 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d250 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1d260 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1d270 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d280 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1d290 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1d2a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1d2b0 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69  /* If the read i
1d2c0 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  s unsuccessful, 
1d2d0 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65  set the dbFileVe
1d2e0 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e  rs[] to somethin
1d2f0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  g.      ** that 
1d300 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20  will never be a 
1d310 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69  valid file versi
1d320 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b  on.  dbFileVers[
1d330 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20  ] is a copy.    
1d340 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34    ** of bytes 24
1d350 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1d360 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e  base.  Bytes 28.
1d370 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  .31 should alway
1d380 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65  s be.      ** ze
1d390 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  ro or the size o
1d3a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1d3b0 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32  n page. Bytes 32
1d3c0 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a  ..35 and 35..39.
1d3d0 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
1d3e0 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  be page numbers 
1d3f0 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
1d400 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20  0xffffffff.  So 
1d410 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  filling.      **
1d420 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56   pPager->dbFileV
1d430 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30  ers[] with all 0
1d440 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64  xff bytes should
1d450 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20   suffice..      
1d460 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
1d470 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
1d480 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61  abase, the situa
1d490 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d  tion is more com
1d4a0 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20  plex:  bytes.   
1d4b0 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20     ** 24..39 of 
1d4c0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
1d4d0 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42   white noise.  B
1d4e0 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  ut the probabili
1d4f0 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ty of.      ** w
1d500 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75  hite noising equ
1d510 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f  aling 16 bytes o
1d520 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68  f 0xff is vanish
1d530 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20  ingly small so. 
1d540 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c       ** we shoul
1d550 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20  d still be ok.. 
1d560 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65       */.      me
1d570 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46  mset(pPager->dbF
1d580 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73  ileVers, 0xff, s
1d590 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1d5a0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1d5b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
1d5c0 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28  *dbFileVers = &(
1d5d0 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  (u8*)pPg->pData)
1d5e0 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  [24];.      memc
1d5f0 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
1d600 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
1d610 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  rs, sizeof(pPage
1d620 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1d630 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44  .    }.  }.  COD
1d640 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d  EC1(pPager, pPg-
1d650 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c  >pData, pgno, 3,
1d660 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1d670 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e  EM);..  PAGER_IN
1d680 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1d690 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
1d6a0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1d6b0 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
1d6c0 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
1d6d0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1d6e0 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54  pgno));.  PAGERT
1d6f0 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20  RACE(("FETCH %d 
1d700 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
1d710 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
1d720 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1d730 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
1d740 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1d750 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
1d760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  ;.}../*.** Updat
1d770 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
1d780 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1d790 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34 20  r at offsets 24 
1d7a0 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65  and 92 in.** the
1d7b0 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
1d7c0 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  sqlite version n
1d7d0 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20  umber at offset 
1d7e0 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  96..**.** This i
1d7f0 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  s an uncondition
1d800 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65 20  al update.  See 
1d810 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69  also the pager_i
1d820 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1d830 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  r().** routine w
1d840 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65  hich only update
1d850 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  s the change-cou
1d860 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64 61  nter if the upda
1d870 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a  te is actually.*
1d880 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74  * needed, as det
1d890 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70  ermined by the p
1d8a0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1d8b0 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72  ntDone state var
1d8c0 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
1d8d0 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74   void pager_writ
1d8e0 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
1d8f0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75  PgHdr *pPg){.  u
1d900 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
1d910 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65  r;..  /* Increme
1d920 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
1d930 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
1d940 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
1d950 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65   24. */.  change
1d960 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
1d970 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
1d980 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46  pPg->pPager->dbF
1d990 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75  ileVers)+1;.  pu
1d9a0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1d9b0 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  pPg->pData)+24, 
1d9c0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1d9d0 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72  ..  /* Also stor
1d9e0 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72  e the SQLite ver
1d9f0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62  sion number in b
1da00 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20  ytes 96..99 and 
1da10 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32  in.  ** bytes 92
1da20 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63  ..95 store the c
1da30 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f  hange counter fo
1da40 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73  r which the vers
1da50 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  ion number.  ** 
1da60 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70  is valid. */.  p
1da70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1da80 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c  )pPg->pData)+92,
1da90 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1daa0 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1dab0 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1dac0 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52  )+96, SQLITE_VER
1dad0 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a  SION_NUMBER);.}.
1dae0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1daf0 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54  OMIT_WAL./*.** T
1db00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1db10 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72  invoked once for
1db20 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20   each page that 
1db30 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1db40 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
1db50 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77  o the log file w
1db60 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61  hen a WAL transa
1db70 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1db80 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74  back..** Paramet
1db90 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61  er iPg is the pa
1dba0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69  ge number of sai
1dbb0 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78  d page. The pCtx
1dbc0 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73   argument .** is
1dbd0 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e   actually a poin
1dbe0 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
1dbf0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
1dc00 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73  * If page iPg is
1dc10 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
1dc20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e  cache, and has n
1dc30 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
1dc40 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20  ferences,.** it 
1dc50 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74  is discarded. Ot
1dc60 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72  herwise, if ther
1dc70 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  e are one or mor
1dc80 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a  e outstanding.**
1dc90 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65   references, the
1dca0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1dcb0 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74   reloaded from t
1dcc0 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
1dcd0 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74  the.** attempt t
1dce0 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74  o reload content
1dcf0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1dd00 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61  se is required a
1dd10 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65  nd fails, .** re
1dd20 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
1dd30 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
1dd40 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
1dd50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1dd60 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1dd70 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e  (void *pCtx, Pgn
1dd80 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63  o iPg){.  int rc
1dd90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1dda0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1ddb0 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20  (Pager *)pCtx;. 
1ddc0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1ddd0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
1dde0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
1ddf0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
1de00 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
1de10 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50  , iPg);.  if( pP
1de20 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  g ){.    if( sql
1de30 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
1de40 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29  fcount(pPg)==1 )
1de50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1de60 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
1de70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1de80 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
1de90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1dea0 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
1deb0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
1dec0 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  g->pgno, &iFrame
1ded0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1dee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1def0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
1df00 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d  bPage(pPg, iFram
1df10 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1df20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1df30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1df40 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
1df50 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
1df60 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1df70 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1df80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
1df90 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
1dfa0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1dfb0 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
1dfc0 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
1dfd0 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
1dfe0 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
1dff0 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
1e000 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1e010 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
1e020 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1e030 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1e040 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1e050 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1e060 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1e070 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1e080 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1e090 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1e0a0 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1e0b0 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1e0c0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1e0d0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1e0e0 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1e0f0 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1e100 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1e110 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1e120 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1e130 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1e140 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1e150 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1e160 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1e170 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1e180 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1e190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e1a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e1b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1e1c0 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1e1d0 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1e1e0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1e1f0 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1e200 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1e210 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e230 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e240 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1e250 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e270 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1e280 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1e290 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1e2a0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1e2b0 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1e2c0 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1e2d0 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1e2e0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1e2f0 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1e300 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1e310 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1e320 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1e330 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1e340 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1e350 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1e360 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1e370 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1e380 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1e390 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1e3a0 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1e3b0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1e3c0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1e3d0 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1e3e0 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1e3f0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1e400 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1e410 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1e420 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1e430 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1e440 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1e450 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
1e460 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
1e470 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  OK ){.    PgHdr 
1e480 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
1e490 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d  pDirty;.    rc =
1e4a0 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1e4b0 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65  ck((void *)pPage
1e4c0 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  r, pList->pgno);
1e4d0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
1e4e0 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  xt;.  }..  retur
1e4f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1e500 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e510 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
1e520 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1e530 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  s(). As well as 
1e540 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63  logging.** the c
1e550 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  ontents of the l
1e560 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61  ist of pages hea
1e570 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f  ded by pList (co
1e580 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
1e590 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  y),.** this func
1e5a0 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e  tion notifies an
1e5b0 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20  y active backup 
1e5c0 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74  processes that t
1e5d0 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  he pages have.**
1e5e0 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a   changed. .**.**
1e5f0 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   The list of pag
1e600 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  es passed into t
1e610 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1e620 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20  lways sorted by 
1e630 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1e640 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31  Hence, if page 1
1e650 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72   appears anywher
1e660 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69  e on the list, i
1e670 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69  t will be the fi
1e680 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74  rst page..*/ .st
1e690 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61  atic int pagerWa
1e6a0 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72  lFrames(.  Pager
1e6b0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
1e6c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1e6d0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1e6e0 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20  PgHdr *pList,   
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65  /* List of frame
1e710 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67  s to log */.  Pg
1e720 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20  no nTruncate,   
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e740 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   Database size a
1e750 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74  fter this commit
1e760 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1e770 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1e780 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e790 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
1e7a0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1e7b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e7d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1e7e0 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20  t nList;        
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e800 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1e810 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 23 69 66   in pList */.#if
1e820 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1e830 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1e840 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  d(SQLITE_CHECK_P
1e850 41 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a 70  AGES).  PgHdr *p
1e860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e870 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1e880 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1e890 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  s */.#endif..  a
1e8a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1e8b0 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Wal );.  assert(
1e8c0 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66   pList );.#ifdef
1e8d0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1e8e0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1e8f0 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20  he page list is 
1e900 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
1e910 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c  er */.  for(p=pL
1e920 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69  ist; p && p->pDi
1e930 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  rty; p=p->pDirty
1e940 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1e950 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72  ->pgno < p->pDir
1e960 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a  ty->pgno );.  }.
1e970 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1e980 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  ( pList->pDirty=
1e990 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29  =0 || isCommit )
1e9a0 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74  ;.  if( isCommit
1e9b0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1e9c0 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1e9d0 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
1e9e0 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
1e9f0 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67  point in writing
1ea00 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65  .    ** any page
1ea10 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
1ea20 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
1ea30 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20   nTruncate into 
1ea40 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20  the WAL file..  
1ea50 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e    ** They will n
1ea60 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20  ever be read by 
1ea70 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72  any client. So r
1ea80 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
1ea90 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a  the pDirty.    *
1eaa0 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a  * list here. */.
1eab0 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1eac0 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74    PgHdr **ppNext
1ead0 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e   = &pList;.    n
1eae0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  List = 0;.    fo
1eaf0 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e  r(p=pList; (*ppN
1eb00 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70  ext = p)!=0; p=p
1eb10 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1eb20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54   if( p->pgno<=nT
1eb30 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1eb40 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e     ppNext = &p->
1eb50 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20  pDirty;.        
1eb60 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  nList++;.      }
1eb70 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1eb80 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65  t( pList );.  }e
1eb90 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  lse{.    nList =
1eba0 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   1;.  }.  pPager
1ebb0 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
1ebc0 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69  AT_WRITE] += nLi
1ebd0 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  st;..  if( pList
1ebe0 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
1ebf0 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1ec00 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
1ec10 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1ec20 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1ec30 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1ec40 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1ec50 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1ec60 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d  sCommit, pPager-
1ec70 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20  >walSyncFlags.  
1ec80 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1ec90 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1eca0 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
1ecb0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
1ecc0 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1ecd0 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1ece0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
1ecf0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
1ed00 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c  Backup, p->pgno,
1ed10 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29   (u8 *)p->pData)
1ed20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
1ed30 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1ed40 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d  _PAGES.  pList =
1ed50 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
1ed60 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
1ed70 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28  pPCache);.  for(
1ed80 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1ed90 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61  >pDirty){.    pa
1eda0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
1edb0 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (p);.  }.#endif.
1edc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1edd0 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72  ./*.** Begin a r
1ede0 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
1edf0 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a  on the WAL..**.*
1ee00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
1ee10 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  sed to be called
1ee20 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73   "pagerOpenSnaps
1ee30 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69  hot()" because i
1ee40 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a  t essentially.**
1ee50 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f   makes a snapsho
1ee60 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1ee70 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  e at the current
1ee80 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61   point in time a
1ee90 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20  nd preserves.** 
1eea0 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f  that snapshot fo
1eeb0 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61  r use by the rea
1eec0 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20  der in spite of 
1eed0 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61  concurrently cha
1eee0 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72  nges by.** other
1eef0 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63   writers or chec
1ef00 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74  kpointers..*/.st
1ef10 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65  atic int pagerBe
1ef20 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1ef30 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
1ef40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1ef70 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61  ode */.  int cha
1ef80 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  nged = 0;       
1ef90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1efa0 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62   if cache must b
1efb0 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73  e reset */..  as
1efc0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1efd0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  l(pPager) );.  a
1efe0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1eff0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1f000 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
1f010 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
1f020 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  R );..  /* sqlit
1f030 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
1f040 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f  saction() was no
1f050 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  t called for the
1f060 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74   previous.  ** t
1f070 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f  ransaction in lo
1f080 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
1f090 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69  SIVE.  So call i
1f0a0 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20  t now.  If we.  
1f0b0 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e  ** are in lockin
1f0c0 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e  g_mode=NORMAL an
1f0d0 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20  d EndRead() was 
1f0e0 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
1f0f0 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c  d,.  ** the dupl
1f100 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61  icate call is ha
1f110 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rmless..  */.  s
1f120 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1f130 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1f140 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63  er->pWal);..  rc
1f150 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
1f160 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1f170 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  n(pPager->pWal, 
1f180 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28  &changed);.  if(
1f190 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1f1a0 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  | changed ){.   
1f1b0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1f1c0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53  ger);.    if( US
1f1d0 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
1f1e0 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
1f1f0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c  h(pPager->fd, 0,
1f200 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   0);.  }..  retu
1f210 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1f220 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f230 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
1f240 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72  s part of the tr
1f250 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41  ansition from PA
1f260 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50  GER_OPEN.** to P
1f270 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
1f280 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
1f290 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1f2a0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1f2b0 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69  in pages (assumi
1f2c0 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ng the page size
1f2d0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1f2e0 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53  d in Pager.pageS
1f2f0 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ize)..**.** If n
1f300 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1f310 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1f320 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69  urned and the si
1f330 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1f340 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69  se.** in pages i
1f350 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50  s stored in *pnP
1f360 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
1f370 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70  an error code (p
1f380 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45  erhaps.** SQLITE
1f390 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73  _IOERR_FSTAT) is
1f3a0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1f3b0 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
1f3c0 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
1f3d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
1f3e0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
1f3f0 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61  ager, Pgno *pnPa
1f400 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1f410 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1f420 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1f430 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
1f440 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51  nPage */..  /* Q
1f450 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62  uery the WAL sub
1f460 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
1f470 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54  database size. T
1f480 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20  he WalDbsize(). 
1f490 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74   ** function ret
1f4a0 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65  urns zero if the
1f4b0 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e   WAL is not open
1f4c0 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61   (i.e. Pager.pWa
1f4d0 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69  l==0), or.  ** i
1f4e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1f4f0 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ize is not avail
1f500 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61  able. The databa
1f510 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20  se size is not. 
1f520 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72   ** available fr
1f530 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1f540 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67  ystem if the log
1f550 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f   file is empty o
1f560 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  r.  ** contains 
1f570 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74  no valid committ
1f580 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
1f590 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f5a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1f5b0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
1f5c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f5d0 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
1f5e0 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20  CK );.  nPage = 
1f5f0 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
1f600 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1f610 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
1f620 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e  abase size was n
1f630 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ot available fro
1f640 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  m the WAL sub-sy
1f650 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72  stem,.  ** deter
1f660 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e  mine it based on
1f670 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f680 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1f690 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a  If the size.  **
1f6a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f6b0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20   file is not an 
1f6c0 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
1f6d0 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
1f6e0 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f  e,.  ** round do
1f6f0 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73  wn to the neares
1f700 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20  t page. Except, 
1f710 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20  any file larger 
1f720 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65  than 0.  ** byte
1f730 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
1f740 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61  sidered to conta
1f750 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  in at least one 
1f760 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1f770 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1f780 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f7a0 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * Size of db fil
1f7b0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1f7c0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1f7d0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1f7e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1f7f0 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
1f800 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1f810 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
1f820 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1f830 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
1f840 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
1f850 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f860 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f880 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1f890 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61  o)((n+pPager->pa
1f8a0 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67  geSize-1) / pPag
1f8b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1f8c0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1f8d0 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
1f8e0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1f8f0 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ile is greater t
1f900 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  han the.  ** con
1f910 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
1f920 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
1f930 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
1f940 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
1f950 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
1f960 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
1f970 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
1f980 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1f990 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
1f9a0 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
1f9b0 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20  .  }..  *pnPage 
1f9c0 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1f9d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f9e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f9f0 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68  MIT_WAL./*.** Ch
1fa00 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c  eck if the *-wal
1fa10 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65   file that corre
1fa20 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61  sponds to the da
1fa30 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1fa40 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74   pPager.** exist
1fa50 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  s if the databas
1fa60 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f  e is not empy, o
1fa70 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  r verify that th
1fa80 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
1fa90 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28  s.** not exist (
1faa0 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20  by deleting it) 
1fab0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1fac0 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  file is empty..*
1fad0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1fae0 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74  base is not empt
1faf0 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20  y and the *-wal 
1fb00 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65  file exists, ope
1fb10 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69  n the pager.** i
1fb20 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20  n WAL mode.  If 
1fb30 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1fb40 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a  empty or if no *
1fb50 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
1fb60 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72   and.** if no er
1fb70 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  ror occurs, make
1fb80 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
1fb90 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
1fba0 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a  et to.** PAGER_J
1fbb0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a  OURNALMODE_WAL..
1fbc0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1fbd0 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72  ITE_OK or an err
1fbe0 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
1fbf0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68  he caller must h
1fc00 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63  old a SHARED loc
1fc10 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1fc20 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e file to call t
1fc30 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
1fc40 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c   Because an EXCL
1fc50 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1fc60 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71  e db file is req
1fc70 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20  uired to delete 
1fc80 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e  .** a WAL on a n
1fc90 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61  one-empty databa
1fca0 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  se, this ensures
1fcb0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
1fcc0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  e condition .** 
1fcd0 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63  between the xAcc
1fce0 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20  ess() below and 
1fcf0 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
1fd00 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
1fd10 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f  ome .** other co
1fd20 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1fd30 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1fd40 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61  nWalIfPresent(Pa
1fd50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1fd60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1fd70 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
1fd80 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1fd90 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1fda0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1fdb0 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1fdc0 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
1fdd0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1fde0 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20      int isWal;  
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c    /* True if WAL
1fe10 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
1fe20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe40 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1fe50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1fe60 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  /..    rc = page
1fe70 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1fe80 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1fe90 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1fea0 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67  rc;.    if( nPag
1feb0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
1fec0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
1fed0 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
1fee0 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30   pPager->zWal, 0
1fef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1ff00 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  =SQLITE_IOERR_DE
1ff10 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20  LETE_NOENT ) rc 
1ff20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1ff30 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20     isWal = 0;.  
1ff40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1ff50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1ff60 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70  ess(.          p
1ff70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
1ff80 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54  ger->zWal, SQLIT
1ff90 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1ffa0 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b   &isWal.      );
1ffb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1ffc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ffd0 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20        if( isWal 
1ffe0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
1fff0 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63  ase( sqlite3Pcac
20000 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
20010 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
20020 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
20030 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
20040 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  Wal(pPager, 0);.
20050 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20060 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20070 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
20080 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20  ALMODE_WAL ){.  
20090 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
200a0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
200b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
200c0 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LETE;.      }.  
200d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
200e0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
200f0 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61  *.** Playback sa
20100 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69  vepoint pSavepoi
20110 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65  nt. Or, if pSave
20120 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65  point==NULL, the
20130 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68  n playback.** th
20140 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
20150 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
20160 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e  e case pSavepoin
20170 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77  t==NULL occurs w
20180 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41  hen .** a ROLLBA
20190 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73  CK TO command is
201a0 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41   invoked on a SA
201b0 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20  VEPOINT that is 
201c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
201d0 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a  * savepoint..**.
201e0 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69  ** When pSavepoi
201f0 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28  nt is not NULL (
20200 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72  meaning a non-tr
20210 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
20220 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67  int is .** being
20230 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74   rolled back), t
20240 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
20250 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20   consists of up 
20260 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c  to three stages,
20270 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e  .** performed in
20280 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69   the order speci
20290 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  fied:.**.**   * 
202a0 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  Pages are played
202b0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
202c0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
202d0 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20  ting at byte.** 
202e0 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72      offset Pager
202f0 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
20300 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
20310 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65   to .**     Page
20320 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20330 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65  ffset, or to the
20340 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
20350 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
20360 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76  file if PagerSav
20370 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20380 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  t is zero..**.**
20390 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76     * If PagerSav
203a0 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
203b0 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
203c0 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c  hen pages are pl
203d0 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b  ayed.**     back
203e0 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74   starting from t
203f0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
20400 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  r immediately fo
20410 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20  llowing .**     
20420 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20430 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65  HdrOffset to the
20440 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
20450 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
20460 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
20470 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62  re then played b
20480 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ack from the sub
20490 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73  -journal file, s
204a0 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77  tarting.**     w
204b0 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76  ith the PagerSav
204c0 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61  epoint.iSubRec a
204d0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
204e0 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20   the end of.**  
204f0 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
20500 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75  ile..**.** Throu
20510 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61  ghout the rollba
20520 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68  ck process, each
20530 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
20540 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
20550 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
20560 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
20570 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  a bitvec structu
20580 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f  re (variable pDo
20590 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70  ne in the.** imp
205a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f  lementation belo
205b0 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  w). This is used
205c0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
205d0 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a  a page is only.*
205e0 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  * rolled back th
205f0 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20  e first time it 
20600 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
20610 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c  n either journal
20620 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65  ..**.** If pSave
20630 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  point is NULL, t
20640 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e  hen pages are on
20650 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  ly played back f
20660 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  rom the main.** 
20670 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
20680 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
20690 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74  or a bitvec in t
206a0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
206b0 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
206c0 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20  before playback 
206d0 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61  commences the Pa
206e0 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61  ger.dbSize varia
206f0 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20  ble.** is reset 
20700 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  to the value tha
20710 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65  t it held at the
20720 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61   start of the sa
20730 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20  vepoint .** (or 
20740 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f  transaction). No
20750 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67   page with a pag
20760 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e-number greater
20770 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
20780 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61  .** is played ba
20790 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e  ck. If one is en
207a0 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
207b0 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a  simply skipped..
207c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
207d0 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
207e0 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
207f0 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69  er, PagerSavepoi
20800 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b  nt *pSavepoint){
20810 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
20820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
20830 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
20840 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20850 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  l */.  i64 iHdrO
20860 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
20870 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20  /* End of first 
20880 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d  segment of main-
20890 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
208a0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
208b0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
208c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
208d0 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20    Bitvec *pDone 
208e0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69  = 0;       /* Bi
208f0 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70  tvec to ensure p
20900 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b  ages played back
20910 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20   only once */.. 
20920 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20930 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
20940 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
20950 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20960 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
20970 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41  OCKED );..  /* A
20980 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
20990 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
209a0 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
209b0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
209c0 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
209d0 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
209e0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
209f0 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
20a00 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
20a10 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
20a20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
20a30 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
20a40 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61  .  /* Set the da
20a50 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b  tabase size back
20a60 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
20a70 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20   was before the 
20a80 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
20a90 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77  being reverted w
20aa0 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  as opened..  */.
20ab0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20ac0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20   = pSavepoint ? 
20ad0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
20ae0 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  g : pPager->dbOr
20af0 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  igSize;.  pPager
20b00 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
20b10 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
20b20 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53  File;..  if( !pS
20b30 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65  avepoint && page
20b40 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20b50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
20b60 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70  gerRollbackWal(p
20b70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
20b80 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f  * Use pPager->jo
20b90 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20  urnalOff as the 
20ba0 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  effective size o
20bb0 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  f the main rollb
20bc0 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
20bd0 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69  .  The actual fi
20be0 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  le might be larg
20bf0 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a  er than this in.
20c00 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e    ** PAGER_JOURN
20c10 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
20c20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  or PAGER_JOURNAL
20c30 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42  MODE_PERSIST.  B
20c40 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a  ut anything.  **
20c50 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f   past pPager->jo
20c60 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d  urnalOff is off-
20c70 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20  limits to us..  
20c80 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  */.  szJ = pPage
20c90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
20ca0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
20cb0 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
20cc0 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20  || szJ==0 );..  
20cd0 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c  /* Begin by roll
20ce0 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
20cf0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
20d00 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
20d10 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  at.  ** PagerSav
20d20 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
20d30 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
20d40 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
20d50 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54  l header..  ** T
20d60 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65  here might be re
20d70 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69  cords in the mai
20d80 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68  n journal that h
20d90 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ave a page numbe
20da0 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74  r.  ** greater t
20db0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
20dc0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70  database size (p
20dd0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62  Pager->dbSize) b
20de0 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69  ut those.  ** wi
20df0 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75  ll be skipped au
20e00 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61  tomatically.  Pa
20e10 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  ges are added to
20e20 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20   pDone as they. 
20e30 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62   ** are played b
20e40 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ack..  */.  if( 
20e50 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  pSavepoint && !p
20e60 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
20e70 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66  r) ){.    iHdrOf
20e80 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
20e90 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61  iHdrOffset ? pSa
20ea0 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
20eb0 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70  set : szJ;.    p
20ec0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20ed0 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
20ee0 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69  iOffset;.    whi
20ef0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
20f00 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
20f10 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20  rnalOff<iHdrOff 
20f20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
20f30 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
20f40 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
20f50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20f60 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
20f70 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
20f80 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
20f90 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NE );.  }else{. 
20fa0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
20fb0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
20fc0 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
20fd0 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
20fe0 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
20ff0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
21000 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
21010 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
21020 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
21030 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
21040 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
21050 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
21060 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
21070 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
21080 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
21090 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
210a0 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
210b0 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
210c0 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
210d0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
210e0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
210f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
21100 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
21110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
21120 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
21130 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20   u32 nJRec = 0; 
21140 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21150 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
21160 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
21170 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
21180 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
21190 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  r, 0, szJ, &nJRe
211a0 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
211b0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
211c0 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20  TE_DONE );..    
211d0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70  /*.    ** The "p
211e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
211f0 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
21200 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
21210 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20  ->journalOff".  
21220 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c    ** test is rel
21230 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23  ated to ticket #
21240 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64  2565.  See the d
21250 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65  iscussion in the
21260 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  .    ** pager_pl
21270 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f  ayback() functio
21280 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  n for additional
21290 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
212a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52    */.    if( nJR
212b0 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  ec==0 .     && p
212c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
212d0 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
212e0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
212f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20  ->journalOff.   
21300 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
21310 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70  = (u32)((szJ - p
21320 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21330 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  f)/JOURNAL_PG_SZ
21340 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
21350 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72  .    for(ii=0; r
21360 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21370 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67  ii<nJRec && pPag
21380 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
21390 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  zJ; ii++){.     
213a0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
213b0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
213c0 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
213d0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
213e0 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
213f0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
21400 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
21410 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
21420 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
21430 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
21440 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  =szJ );..  /* Fi
21450 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b  nally,  rollback
21460 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
21470 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61  sub-journal.  Pa
21480 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a  ge that were.  *
21490 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c  * previously rol
214a0 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20  led back out of 
214b0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
214c0 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20   (and are hence 
214d0 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77  in pDone).  ** w
214e0 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ill be skipped. 
214f0 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   Out-of-range pa
21500 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69  ges are also ski
21510 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  pped..  */.  if(
21520 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
21530 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
21540 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21550 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34  unter */.    i64
21560 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70   offset = (i64)p
21570 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
21580 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
21590 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  geSize);..    if
215a0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
215b0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
215c0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61  c = sqlite3WalSa
215d0 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67  vepointUndo(pPag
215e0 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70  er->pWal, pSavep
215f0 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b  oint->aWalData);
21600 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
21610 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
21620 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
21630 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
21640 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
21650 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21660 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69   offset==(i64)ii
21670 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
21680 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72  Size) );.      r
21690 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
216a0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
216b0 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f  er, &offset, pDo
216c0 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 0, 1);.    }
216d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
216e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
216f0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
21700 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
21710 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
21720 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
21730 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21740 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20  f = szJ;.  }..  
21750 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21760 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
21770 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
21780 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
21790 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
217a0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
217b0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
217c0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
217d0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
217e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
217f0 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
21800 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
21810 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  age);.}../*.** I
21820 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e  nvoke SQLITE_FCN
21830 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73  TL_MMAP_SIZE bas
21840 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
21850 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61  t value of szMma
21860 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
21870 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d  d pagerFixMaplim
21880 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
21890 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
218a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
218b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
218c0 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20   = pPager->fd;. 
218d0 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20   if( isOpen(fd) 
218e0 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  && fd->pMethods-
218f0 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a  >iVersion>=3 ){.
21900 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
21910 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70  4 sz;.    sz = p
21920 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20  Pager->szMmap;. 
21930 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46     pPager->bUseF
21940 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20  etch = (sz>0);. 
21950 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
21960 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
21970 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
21980 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
21990 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  &sz);.  }.#endif
219a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
219b0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
219c0 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20  e of any memory 
219d0 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20  mapping made of 
219e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
219f0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
21a00 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
21a10 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
21a20 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
21a30 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67   szMmap){.  pPag
21a40 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d  er->szMmap = szM
21a50 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d  map;.  pagerFixM
21a60 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
21a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
21a80 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
21a90 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74   possible from t
21aa0 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69  he pager..*/.voi
21ab0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  d sqlite3PagerSh
21ac0 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67  rink(Pager *pPag
21ad0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
21ae0 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65  acheShrink(pPage
21af0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
21b00 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74  /*.** Adjust set
21b10 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  tings of the pag
21b20 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  er to those spec
21b30 69 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46  ified in the pgF
21b40 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a  lags parameter..
21b50 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c  **.** The "level
21b60 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50  " in pgFlags & P
21b70 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
21b80 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72  _MASK sets the r
21b90 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20  obustness.** of 
21ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
21bb0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
21bc0 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65   crashes or powe
21bd0 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a  r failures by.**
21be0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
21bf0 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
21c00 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68   when writing th
21c10 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  e journals..** T
21c20 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
21c30 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
21c40 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
21c50 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
21c60 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
21c70 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
21c80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21c90 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
21ca0 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
21cb0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
21cc0 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
21cd0 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
21ce0 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
21cf0 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
21d00 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
21d10 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
21d20 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
21d30 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
21d40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21d50 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
21d60 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
21d70 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
21d80 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
21d90 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
21da0 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
21db0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
21dc0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
21de0 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
21df0 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
21e00 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
21e10 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
21e20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
21e30 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
21e40 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
21e50 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
21e60 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
21e70 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
21e80 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
21e90 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
21ea0 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
21eb0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
21ec0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
21ed0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21ee0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
21ef0 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
21f00 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
21f10 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
21f20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
21f30 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
21f40 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
21f60 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
21f70 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
21f80 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
21f90 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
21fa0 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
21fb0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
21fc0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
21fd0 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
21ff0 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
22000 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
22010 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
22020 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ack..**.** The a
22030 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f  bove is for a ro
22040 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d  llback-journal m
22050 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f  ode.  For WAL mo
22060 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65  de, OFF continue
22070 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61  s.** to mean tha
22080 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20  t no syncs ever 
22090 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d  occur.  NORMAL m
220a0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
220b0 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70  L is synced.** p
220c0 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
220d0 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20  t of checkpoint 
220e0 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
220f0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 73 79  abase file is sy
22100 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63  nced.** at the c
22110 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65  onclusion of the
22120 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74   checkpoint if t
22130 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
22140 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20  t of the WAL.** 
22150 77 61 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b  was written back
22160 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
22170 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63  se.  But no sync
22180 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75   operations occu
22190 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69  r for.** an ordi
221a0 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e  nary commit in N
221b0 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20  ORMAL mode with 
221c0 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73  WAL.  FULL means
221d0 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a   that the WAL.**
221e0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
221f0 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63  following each c
22200 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c  ommit operation,
22210 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   in addition to 
22220 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73  the.** syncs ass
22230 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52  ociated with NOR
22240 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  MAL..**.** Do no
22250 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72  t confuse synchr
22260 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20  onous=FULL with 
22270 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22280 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45  .  The.** SQLITE
22290 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f  _SYNC_FULL macro
222a0 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68   means to use th
222b0 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66  e MacOSX-style f
222c0 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69  ull-fsync.** usi
222d0 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46  ng fcntl(F_FULLF
222e0 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53  SYNC).  SQLITE_S
222f0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  YNC_NORMAL means
22300 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64   to do an.** ord
22310 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63 61  inary fsync() ca
22320 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ll.  There is no
22330 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
22340 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  een SQLITE_SYNC_
22350 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49  FULL.** and SQLI
22360 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
22370 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65  n platforms othe
22380 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20  r than MacOSX.  
22390 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68  But the.** synch
223a0 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73  ronous=FULL vers
223b0 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  us synchronous=N
223c0 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65  ORMAL setting de
223d0 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a  termines when.**
223e0 20 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69   the xSync primi
223f0 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tive is called a
22400 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74  nd is relevant t
22410 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e  o all platforms.
22420 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
22430 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
22440 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
22450 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
22460 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
22470 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
22480 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
22490 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
224a0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
224b0 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65 72 20  tFlags(.  Pager 
224c0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
224d0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20  /* The pager to 
224e0 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c  set safety level
224f0 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e   for */.  unsign
22500 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
22510 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73  /* Various flags
22520 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
22530 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61 67  d level = pgFlag
22540 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
22550 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 61 73  ONOUS_MASK;.  as
22560 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26  sert( level>=1 &
22570 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20  & level<=3 );.  
22580 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
22590 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70    (level==1 || p
225a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
225b0 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
225c0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76  >fullSync = (lev
225d0 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
225e0 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
225f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
22600 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  noSync ){.    pP
22610 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22620 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
22630 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
22640 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
22650 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22660 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20  FULLFSYNC ){.   
22670 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
22680 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22690 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65  _FULL;.    pPage
226a0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
226b0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
226c0 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ULL;.  }else if(
226d0 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
226e0 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20  _CKPT_FULLFSYNC 
226f0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
22700 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
22710 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
22720 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
22730 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
22740 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
22750 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
22760 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
22770 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22780 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22790 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
227a0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
227b0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
227c0 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70  walSyncFlags = p
227d0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
227e0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
227f0 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
22800 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
22810 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43  lags |= WAL_SYNC
22820 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20  _TRANSACTIONS;. 
22830 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67 73   }.  if( pgFlags
22840 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53 50   & PAGER_CACHESP
22850 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ILL ){.    pPage
22860 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
22870 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b   ~SPILLFLAG_OFF;
22880 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
22890 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
228a0 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46   |= SPILLFLAG_OF
228b0 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  F;.  }.}.#endif.
228c0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
228d0 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
228e0 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
228f0 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
22900 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
22910 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
22920 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
22930 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
22940 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
22950 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
22960 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
22970 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
22980 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
22990 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
229a0 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
229b0 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
229c0 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72  y file..**.** Wr
229d0 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
229e0 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46  criptor into *pF
229f0 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ile. Return SQLI
22a00 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
22a10 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68   .** or some oth
22a20 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
22a30 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
22a40 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
22a50 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  lly .** delete t
22a60 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
22a70 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
22a80 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  sed..**.** The f
22a90 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74  lags passed to t
22aa0 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70  he VFS layer xOp
22ab0 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68  en() call are th
22ac0 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ose specified.**
22ad0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66   by parameter vf
22ae0 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68  sFlags ORed with
22af0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
22b00 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
22b10 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
22b20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
22b30 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20  EN_CREATE.**    
22b40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
22b50 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51  LUSIVE.**     SQ
22b60 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
22b70 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69  ONCLOSE.*/.stati
22b80 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74  c int pagerOpent
22b90 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
22ba0 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
22bb0 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
22bc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
22bd0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
22be0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
22bf0 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
22c00 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
22c10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
22c20 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
22c30 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
22c40 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
22c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22c60 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  urn code */..#if
22c70 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
22c80 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
22c90 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
22ca0 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
22cb0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
22cc0 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
22cd0 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
22ce0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22cf0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
22d00 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
22d10 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
22d20 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
22d30 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
22d40 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
22d50 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
22d60 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
22d70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
22d80 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
22d90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
22da0 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a  sOpen(pFile) );.
22db0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22dc0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
22dd0 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
22de0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ion..**.** The p
22df0 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65  ager invokes the
22e00 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66   busy-handler if
22e10 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
22e20 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
22e30 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72  ITE_BUSY when tr
22e40 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
22e50 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20  from no-lock to 
22e60 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a  a SHARED lock,.*
22e70 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67  * or when trying
22e80 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
22e90 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
22ea0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
22eb0 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f   .** lock. It do
22ec0 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20  es *not* invoke 
22ed0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
22ee0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
22ef0 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74  from.** SHARED t
22f00 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77  o RESERVED, or w
22f10 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
22f20 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43  om SHARED to EXC
22f30 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68  LUSIVE.** (which
22f40 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68   occurs during h
22f50 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
22f60 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a  ack). Summary:.*
22f70 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f  *.**   Transitio
22f80 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
22f90 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b           | Invok
22fa0 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a  es xBusyHandler.
22fb0 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
22fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
22ff0 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20     NO_LOCK      
23000 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   -> SHARED_LOCK 
23010 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20       | Yes.**   
23020 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
23030 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20   RESERVED_LOCK  
23040 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52    | No.**   SHAR
23050 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43  ED_LOCK   -> EXC
23060 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
23070 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44  No.**   RESERVED
23080 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49  _LOCK -> EXCLUSI
23090 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a  VE_LOCK   | Yes.
230a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73  **.** If the bus
230b0 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
230c0 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ck returns non-z
230d0 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
230e0 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66   .** retried. If
230f0 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
23100 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54  , then the SQLIT
23110 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a  E_BUSY error is.
23120 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ** returned to t
23130 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65  he caller of the
23140 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
23150 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
23160 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
23170 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72  handler(.  Pager
23180 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
231b0 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
231c0 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29  Handler)(void *)
231d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ,         /* Poi
231e0 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e  nter to busy-han
231f0 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  dler function */
23200 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
23210 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20  ndlerArg        
23220 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
23230 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ent to pass to x
23240 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29  BusyHandler */.)
23250 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73  {.  pPager->xBus
23260 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79  yHandler = xBusy
23270 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65  Handler;.  pPage
23280 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
23290 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  rg = pBusyHandle
232a0 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f  rArg;..  if( isO
232b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
232c0 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70  ){.    void **ap
232d0 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61   = (void **)&pPa
232e0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
232f0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  r;.    assert( (
23300 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29  (int(*)(void *))
23310 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48  (ap[0]))==xBusyH
23320 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73  andler );.    as
23330 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75  sert( ap[1]==pBu
23340 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a  syHandlerArg );.
23350 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
23360 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
23370 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
23380 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45  FCNTL_BUSYHANDLE
23390 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a  R, (void *)ap);.
233a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
233b0 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
233c0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
233d0 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
233e0 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
233f0 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
23400 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
23410 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
23420 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
23430 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
23440 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
23450 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
23460 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
23470 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
23480 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
23490 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
234a0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
234b0 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  RR, an SQLITE_IO
234c0 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65  ERR_xxx sub-code
234d0 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29   or SQLITE_FULL)
234e0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
234f0 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  e, if all of the
23500 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
23510 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74  rue:.**.**   * t
23520 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
23530 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67   (value of *pPag
23540 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20  eSize) is valid 
23550 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20  (a power .**    
23560 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20   of two between 
23570 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d  512 and SQLITE_M
23580 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e  AX_PAGE_SIZE, in
23590 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a  clusive), and.**
235a0 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72  .**   * there ar
235b0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
235c0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
235d0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
235e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
235f0 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e  either not an in
23600 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
23610 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20   or it is.**    
23620 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
23630 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72  tabase that curr
23640 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f  ently consists o
23650 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a  f zero pages..**
23660 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67  .** then the pag
23670 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73  er object page s
23680 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70  ize is set to *p
23690 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
236a0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
236b0 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
236c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
236d0 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65  uses sqlite3Page
236e0 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f  rMalloc() .** to
236f0 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61   obtain a new Pa
23700 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
23710 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c  ffer. If this al
23720 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
23730 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49   .** fails, SQLI
23740 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
23750 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
23760 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75  e size remains u
23770 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e  nchanged. .** In
23780 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
23790 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
237a0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
237b0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
237c0 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20  is not changed, 
237d0 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f  either because o
237e0 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72  ne of the enumer
237f0 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ated.** conditio
23800 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ns above is not 
23810 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20  true, the pager 
23820 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61  was in error sta
23830 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
23840 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
23850 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20  led, or because 
23860 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
23870 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61  ation attempt fa
23880 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a  iled, .** then *
23890 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74  pPageSize is set
238a0 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74   to the old, ret
238b0 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20  ained page size 
238c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
238d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
238e0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
238f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
23900 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20  u32 *pPageSize, 
23910 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20  int nReserve){. 
23920 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23930 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  _OK;..  /* It is
23940 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
23950 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72   do a full asser
23960 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
23970 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20  here, as this.  
23980 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  ** function may 
23990 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
239a0 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28  ithin PagerOpen(
239b0 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74  ), before the st
239c0 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ate.  ** of the 
239d0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  Pager object is 
239e0 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69  internally consi
239f0 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stent..  **.  **
23a00 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
23a10 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
23a20 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  rned an error if
23a30 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
23a40 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52  n .  ** PAGER_ER
23a50 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73  ROR state. But s
23a60 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52  ince PAGER_ERROR
23a70 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65   state guarantee
23a80 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72  s that.  ** ther
23a90 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  e is at least on
23aa0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  e outstanding pa
23ab0 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68  ge reference, th
23ac0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
23ad0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
23ae0 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77  that case anyhow
23af0 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61  ..  */..  u32 pa
23b00 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
23b10 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
23b20 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
23b30 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
23b40 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
23b50 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
23b60 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
23b70 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
23b80 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
23b90 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63  .   && sqlite3Pc
23ba0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
23bb0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
23bc0 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65   .   && pageSize
23bd0 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75   && pageSize!=(u
23be0 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
23bf0 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ize .  ){.    ch
23c00 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b  ar *pNew = NULL;
23c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a  New temp space *
23c30 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20  /.    i64 nByte 
23c40 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50  = 0;..    if( pP
23c50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
23c60 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65  ER_OPEN && isOpe
23c70 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
23c80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23c90 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
23ca0 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65  ager->fd, &nByte
23cb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
23cc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23cd0 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28  {.      pNew = (
23ce0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
23cf0 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
23d00 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
23d10 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54  New ) rc = SQLIT
23d20 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a  E_NOMEM;.    }..
23d30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23d40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
23d50 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
23d60 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
23d70 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
23d80 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
23d90 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
23da0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
23db0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
23dc0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
23dd0 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
23de0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
23df0 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
23e00 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
23e10 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
23e20 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67  SetPageSize(pPag
23e30 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
23e40 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
23e50 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20  }..  *pPageSize 
23e60 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
23e70 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ze;.  if( rc==SQ
23e80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
23e90 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20  f( nReserve<0 ) 
23ea0 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65  nReserve = pPage
23eb0 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  r->nReserve;.   
23ec0 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
23ed0 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
23ee0 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61  <1000 );.    pPa
23ef0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
23f00 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (i16)nReserve;. 
23f10 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
23f20 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
23f30 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
23f40 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
23f50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23f60 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
23f70 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
23f80 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
23f90 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
23fa0 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
23fb0 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
23fc0 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
23fd0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
23fe0 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
23ff0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
24000 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
24010 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
24020 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
24030 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
24040 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
24050 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
24060 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
24070 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
24080 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
24090 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
240a0 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
240b0 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
240c0 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
240d0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
240e0 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
240f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
24100 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
24110 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
24120 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
24130 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
24140 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
24150 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
24160 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
24170 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
24180 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
24190 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
241a0 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
241b0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
241c0 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
241d0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
241e0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
241f0 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
24200 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
24210 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
24220 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
24230 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
24240 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
24250 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24260 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
24270 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
24280 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
24290 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
242a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
242b0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
242c0 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61  EN );      /* Ca
242d0 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f  lled only by OP_
242e0 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73  MaxPgcnt */.  as
242f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78  sert( pPager->mx
24300 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno>=pPager->db
24310 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d  Size );  /* OP_M
24320 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73  axPgcnt enforces
24330 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72   this */.  retur
24340 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
24350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
24360 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
24370 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
24380 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
24390 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
243a0 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
243b0 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
243c0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
243d0 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
243e0 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
243f0 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
24400 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
24410 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
24420 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
24430 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
24440 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
24450 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
24460 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
24470 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
24480 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
24490 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
244a0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
244b0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
244c0 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
244d0 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
244e0 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
244f0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
24500 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
24510 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
24520 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
24530 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
24540 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
24550 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
24560 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
24570 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
24580 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24590 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
245a0 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
245b0 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
245c0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
245d0 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
245e0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
245f0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
24600 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
24610 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
24620 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
24630 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
24640 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
24650 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
24660 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74   to. .**.** If t
24670 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65  he pager was ope
24680 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65  ned on a transie
24690 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61  nt file (zFilena
246a0 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f  me==""), or.** o
246b0 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20  pened on a file 
246c0 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65  less than N byte
246d0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f  s in size, the o
246e0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a  utput buffer is.
246f0 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51  ** zeroed and SQ
24700 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
24710 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20  . The rationale 
24720 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
24730 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
24740 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
24750 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ad database head
24760 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74  ers, and a new t
24770 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a  ransient or.** z
24780 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61  ero sized databa
24790 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20  se has a header 
247a0 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e  than consists en
247b0 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73  tirely of zeroes
247c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49  ..**.** If any I
247d0 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72  O error apart fr
247e0 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  om SQLITE_IOERR_
247f0 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e  SHORT_READ is en
24800 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68  countered,.** th
24810 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
24820 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
24830 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63  caller and the c
24840 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
24850 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  * output buffer 
24860 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e  undefined..*/.in
24870 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
24880 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
24890 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
248a0 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
248b0 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
248c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
248d0 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
248e0 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28  0, N);.  assert(
248f0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
24900 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
24910 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  empFile );..  /*
24920 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
24930 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
24940 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c  btree immediatel
24950 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67  y after creating
24960 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20  .  ** the Pager 
24970 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68  object.  There h
24980 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f  as not been an o
24990 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72  pportunity to tr
249a0 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  ansition.  ** to
249b0 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20   WAL mode yet.. 
249c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
249d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
249e0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f  r) );..  if( isO
249f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
24a00 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
24a10 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
24a20 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
24a30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24a40 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
24a50 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
24a60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24a70 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
24a80 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
24a90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
24aa0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
24ab0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
24ac0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f  s function may o
24ad0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
24ae0 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
24af0 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
24b00 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49  .** the pager. I
24b10 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  t returns the to
24b20 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
24b30 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
24b40 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76  ase..**.** Howev
24b50 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20  er, if the file 
24b60 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  is between 1 and
24b70 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74   <page-size> byt
24b80 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e  es in size, then
24b90 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e   .** this is con
24ba0 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65  sidered a 1 page
24bb0 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
24bc0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
24bd0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
24be0 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29  er, int *pnPage)
24bf0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
24c00 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
24c10 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
24c20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
24c30 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54  tate!=PAGER_WRIT
24c40 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20  ER_FINISHED );. 
24c50 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29   *pnPage = (int)
24c60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
24c70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
24c80 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
24c90 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
24ca0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
24cb0 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
24cc0 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
24cd0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
24ce0 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
24cf0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
24d00 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
24d10 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
24d20 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
24d30 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
24d40 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
24d50 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
24d60 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
24d70 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
24d80 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
24d90 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
24da0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
24db0 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
24dc0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
24dd0 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
24de0 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
24df0 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
24e00 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
24e10 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
24e20 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
24e30 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
24e40 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
24e50 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
24e60 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
24e70 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
24e80 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
24e90 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
24ea0 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
24eb0 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
24ec0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
24ed0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
24ee0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
24ef0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24f00 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
24f10 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f30 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
24f40 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ode */..  /* Che
24f50 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
24f60 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
24f70 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
24f80 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
24f90 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
24fa0 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
24fb0 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61  transistions tha
24fc0 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
24fd0 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
24fe0 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
24ff0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
25000 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
25010 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
25020 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
25030 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25040 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d  (pPager->eLock>=
25050 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
25060 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
25070 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c  ck==NO_LOCK && l
25080 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
25090 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20  LOCK).       || 
250a0 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
250b0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
250c0 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
250d0 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a  SIVE_LOCK).  );.
250e0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
250f0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
25100 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  ger, locktype);.
25110 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
25120 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61  LITE_BUSY && pPa
25130 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
25140 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
25150 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20  andlerArg) );.  
25160 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25170 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73  .** Function ass
25180 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25190 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68  raint(pPager) ch
251a0 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  ecks that one of
251b0 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69   the .** followi
251c0 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61  ng is true for a
251d0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63  ll dirty pages c
251e0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
251f0 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a  page-cache:.**.*
25200 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20  *   a) The page 
25210 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
25220 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
25230 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
25240 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74  .**      current
25250 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
25260 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a   in pages, OR.**
25270 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20  .**   b) if the 
25280 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72  page content wer
25290 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69  e written at thi
252a0 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64  s time, it would
252b0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20   not.**      be 
252c0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
252d0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  te the current c
252e0 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68  ontent out to th
252f0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
25300 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d        (as determ
25310 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e  ined by function
25320 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
25330 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  e())..**.** If t
25340 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73  he condition ass
25350 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75  erted by this fu
25360 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20  nction were not 
25370 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a  true, and the.**
25380 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65   dirty page were
25390 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64   to be discarded
253a0 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
253b0 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72  via the pagerStr
253c0 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ess().** routine
253d0 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  , pagerStress() 
253e0 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20  would not write 
253f0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
25400 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74   content to.** t
25410 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25420 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74  . If a savepoint
25430 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72   transaction wer
25440 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66  e rolled back af
25450 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70  ter.** this happ
25460 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63  ened, the correc
25470 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c 64  t behavior would
25480 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74   be to restore t
25490 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
254a0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
254b0 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  e. However, sinc
254c0 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69  e this content i
254d0 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
254e0 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64   either.** the d
254f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
25500 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  the portion of t
25510 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
25520 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d  nal and .** sub-
25530 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62  journal rolled b
25540 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ack the content 
25550 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73  could not be res
25560 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  tored and the.**
25570 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
25580 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  would become cor
25590 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72  rupt. It is ther
255a0 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20  efore fortunate 
255b0 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69  that .** this ci
255c0 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f  rcumstance canno
255d0 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20  t arise..*/.#if 
255e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
255f0 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
25600 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
25610 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48  ConstraintCb(PgH
25620 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  dr *pPg){.  asse
25630 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
25640 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
25650 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71  assert( !subjReq
25660 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c  uiresPage(pPg) |
25670 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67  | pPg->pgno<=pPg
25680 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ->pPager->dbSize
25690 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   );.}.static voi
256a0 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
256b0 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72  Constraint(Pager
256c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
256d0 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
256e0 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
256f0 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72  PCache, assertTr
25700 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25710 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Cb);.}.#else.# d
25720 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e  efine assertTrun
25730 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
25740 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f  Pager).#endif../
25750 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
25760 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
25770 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
25780 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
25790 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
257a0 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
257b0 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
257c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
257d0 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
257e0 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
257f0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
25800 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
25810 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
25820 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
25830 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
25840 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
25850 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
25860 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
25870 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
25880 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65  led right before
25890 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
258a0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e  ansaction..** On
258b0 63 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ce this function
258c0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
258d0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
258e0 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65  n must either be
258f0 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
25900 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74  or committed. It
25910 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
25920 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
25930 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63  on and.** then c
25940 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20  ontinue writing 
25950 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
25960 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25970 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
25980 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
25990 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
259a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
259b0 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29  >dbSize>=nPage )
259c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
259d0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
259e0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
259f0 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  D );.  pPager->d
25a00 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a  bSize = nPage;..
25a10 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    /* At one poin
25a20 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  t the code here 
25a30 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75  called assertTru
25a40 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25a50 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65  ) to.  ** ensure
25a60 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
25a70 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20  being truncated 
25a80 61 77 61 79 20 62 79 20 74 68 69 73 20 6f 70 65  away by this ope
25a90 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a  ration are,.  **
25aa0 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
25ab0 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f  savepoints are o
25ac0 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20  pen, present in 
25ad0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
25ae0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74   ** journal so t
25af0 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20  hat they can be 
25b00 72 65 73 74 6f 72 65 64 20 69 66 20 74 68 65 20  restored if the 
25b10 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c  savepoint is rol
25b20 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54  led.  ** back. T
25b30 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  his is no longer
25b40 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
25b50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
25b60 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c  ow only.  ** cal
25b70 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65  led right before
25b80 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
25b90 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c  ansaction. So al
25ba0 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a  though the .  **
25bb0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61   Pager object ma
25bc0 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65  y still have ope
25bd0 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61  n savepoints (Pa
25be0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d  ger.nSavepoint!=
25bf0 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63  0), .  ** they c
25c00 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
25c10 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73  back. So the ass
25c20 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25c30 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a  raint() call.  *
25c40 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63  * is no longer c
25c50 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f  orrect. */.}.../
25c60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25c70 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
25c80 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
25c90 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
25ca0 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e  lback. It.** syn
25cb0 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  cs the journal f
25cc0 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65  ile to disk, the
25cd0 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a  n sets pPager->j
25ce0 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65  ournalHdr to the
25cf0 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
25d00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20  journal file so 
25d10 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70  that the pager_p
25d20 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
25d30 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20  e knows.** that 
25d40 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
25d50 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
25d60 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53   synced..**.** S
25d70 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  yncing a hot-jou
25d80 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66  rnal to disk bef
25d90 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
25da0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65  o roll it back e
25db0 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20  nsures .** that 
25dc0 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75  if a power-failu
25dd0 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  re occurs during
25de0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74   the rollback, t
25df0 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a  he process that.
25e00 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c  ** attempts roll
25e10 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73  back following s
25e20 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73  ystem recovery s
25e30 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75  ees the same jou
25e40 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rnal.** content 
25e50 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  as this process.
25e60 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
25e70 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61  hing goes as pla
25e80 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  nned, SQLITE_OK 
25e90 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
25ea0 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53  erwise, .** an S
25eb0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
25ec0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25ed0 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
25ee0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
25ef0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
25f00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
25f10 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
25f20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
25f30 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
25f40 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
25f50 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a  NC_NORMAL);.  }.
25f60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25f70 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
25f80 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
25f90 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
25fa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
25fb0 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dr);.  }.  retur
25fc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
25fd0 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
25fe0 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61  e to a memory ma
25ff0 70 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74  pped page object
26000 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
26010 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e   pgno. .** The n
26020 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75  ew object will u
26030 73 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  se the pointer p
26040 44 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66  Data, obtained f
26050 72 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a  rom xFetch()..**
26060 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
26070 73 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70  set *ppPage to p
26080 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
26090 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a  page reference.*
260a0 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  * and return SQL
260b0 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
260c0 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  e, return an SQL
260d0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61  ite error code a
260e0 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67  nd set.** *ppPag
260f0 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  e to zero..**.**
26100 20 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   Page references
26110 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c   obtained by cal
26120 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
26130 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c  on should be rel
26140 65 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c  eased.** by call
26150 69 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65  ing pagerRelease
26160 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
26170 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63  atic int pagerAc
26180 71 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20  quireMapPage(.  
26190 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261b0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
261c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
261f0 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ber */.  void *p
26200 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
26210 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
26220 63 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20  ch()'d data for 
26230 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
26240 67 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20  gHdr **ppPage   
26250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26260 2a 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20  * OUT: Acquired 
26270 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  page object */.)
26280 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262a0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
262b0 70 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74  pped page to ret
262c0 75 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  urn */..  if( pP
262d0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
262e0 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  ist ){.    *ppPa
262f0 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d  ge = p = pPager-
26300 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a  >pMmapFreelist;.
26310 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61      pPager->pMma
26320 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70  pFreelist = p->p
26330 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
26340 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65  irty = 0;.    me
26350 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20  mset(p->pExtra, 
26360 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
26370 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  a);.  }else{.   
26380 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28   *ppPage = p = (
26390 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d  PgHdr *)sqlite3M
263a0 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
263b0 28 50 67 48 64 72 29 20 2b 20 70 50 61 67 65 72  (PgHdr) + pPager
263c0 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69  ->nExtra);.    i
263d0 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( p==0 ){.     
263e0 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
263f0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
26400 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50  64)(pgno-1) * pP
26410 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
26420 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65  pData);.      re
26430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
26440 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  M;.    }.    p->
26450 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a  pExtra = (void *
26460 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66  )&p[1];.    p->f
26470 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41  lags = PGHDR_MMA
26480 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  P;.    p->nRef =
26490 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65   1;.    p->pPage
264a0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a  r = pPager;.  }.
264b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
264c0 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70  xtra==(void *)&p
264d0 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  [1] );.  assert(
264e0 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a   p->pPage==0 );.
264f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61    assert( p->fla
26500 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29  gs==PGHDR_MMAP )
26510 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
26520 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
26530 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52  .  assert( p->nR
26540 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70  ef==1 );..  p->p
26550 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d  gno = pgno;.  p-
26560 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a  >pData = pData;.
26570 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
26580 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ut++;..  return 
26590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
265a0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
265b0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
265c0 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61  pPg. pPg must ha
265d0 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64  ve been returned
265e0 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69   by an .** earli
265f0 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  er call to pager
26600 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29  AcquireMapPage()
26610 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26620 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
26630 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
26640 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
26650 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
26660 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
26670 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44  Out--;.  pPg->pD
26680 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
26690 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
266a0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
266b0 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20  elist = pPg;..  
266c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
266d0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
266e0 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73  ersion>=3 );.  s
266f0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
26700 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
26710 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70  )(pPg->pgno-1)*p
26720 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
26730 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a   pPg->pData);.}.
26740 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
26750 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74  PgHdr objects st
26760 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65  ored in the Page
26770 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  r.pMmapFreelist 
26780 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
26790 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61  void pagerFreeMa
267a0 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61  pHdrs(Pager *pPa
267b0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
267c0 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  ;.  PgHdr *pNext
267d0 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
267e0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
267f0 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
26800 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69    pNext = p->pDi
26810 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rty;.    sqlite3
26820 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
26830 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
26840 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
26850 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
26860 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
26870 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
26880 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
26890 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
268a0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
268b0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
268c0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
268d0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
268e0 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
268f0 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
26900 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
26910 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
26920 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
26930 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
26940 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
26950 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
26960 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
26970 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
26980 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
26990 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
269a0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
269b0 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
269c0 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
269d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
269e0 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
269f0 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
26a00 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
26a10 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
26a20 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
26a30 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
26a40 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
26a50 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
26a60 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
26a70 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
26a80 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
26a90 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
26aa0 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
26ab0 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20  er){.  u8 *pTmp 
26ac0 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
26ad0 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73  pTmpSpace;..  as
26ae0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
26af0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
26b00 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69   );.  disable_si
26b10 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
26b20 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
26b30 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
26b40 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61  );.  pagerFreeMa
26b50 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20  pHdrs(pPager);. 
26b60 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43   /* pPager->errC
26b70 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ode = 0; */.  pP
26b80 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
26b90 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
26ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
26bb0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f  .  sqlite3WalClo
26bc0 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  se(pPager->pWal,
26bd0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
26be0 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e  cFlags, pPager->
26bf0 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b  pageSize, pTmp);
26c00 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  .  pPager->pWal 
26c10 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61  = 0;.#endif.  pa
26c20 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
26c30 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
26c40 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
26c50 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  ck(pPager);.  }e
26c60 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69  lse{.    /* If i
26c70 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20  t is open, sync 
26c80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26c90 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
26ca0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
26cb0 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  k..    ** If thi
26cc0 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74  s is not done, t
26cd0 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20  hen an unsynced 
26ce0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  portion of the o
26cf0 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20  pen journal .   
26d00 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20   ** file may be 
26d10 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f  played back into
26d20 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
26d30 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
26d40 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a  e occurs .    **
26d50 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68   while this is h
26d60 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61  appening, the da
26d70 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63  tabase could bec
26d80 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20  ome corrupt..   
26d90 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e   **.    ** If an
26da0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
26db0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79  ile trying to sy
26dc0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  nc the journal, 
26dd0 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a  shift the pager.
26de0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
26df0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69  ERROR state. Thi
26e00 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41  s causes UnlockA
26e10 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e  ndRollback to un
26e20 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20  lock the.    ** 
26e30 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f  database and clo
26e40 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
26e50 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65  ile without atte
26e60 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
26e70 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72  t.    ** back or
26e80 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68   finalize it. Th
26e90 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20  e next database 
26ea0 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74  user will have t
26eb0 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  o do hot-journal
26ec0 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
26ed0 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e   before accessin
26ee0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
26ef0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
26f00 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
26f10 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
26f20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
26f30 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f  ger, pagerSyncHo
26f40 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
26f50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
26f60 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
26f70 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
26f80 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
26f90 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65  ignMalloc();.  e
26fa0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
26fb0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50  io_errors();.  P
26fc0 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53  AGERTRACE(("CLOS
26fd0 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
26fe0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f  (pPager)));.  IO
26ff0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
27000 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
27010 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
27020 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73  Pager->jfd);.  s
27030 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
27040 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c  ager->fd);.  sql
27050 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d  ite3PageFree(pTm
27060 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  p);.  sqlite3Pca
27070 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  cheClose(pPager-
27080 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64  >pPCache);..#ifd
27090 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
270a0 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72  DEC.  if( pPager
270b0 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70  ->xCodecFree ) p
270c0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
270d0 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  e(pPager->pCodec
270e0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
270f0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53  ert( !pPager->aS
27100 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61  avepoint && !pPa
27110 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
27120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
27130 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27140 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
27150 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20  ger->sjfd) );.. 
27160 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
27170 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
27180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
27190 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
271a0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
271b0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
271c0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
271d0 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65   number for page
271e0 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71   pPg..*/.Pgno sq
271f0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
27200 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67  mber(DbPage *pPg
27210 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
27220 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
27230 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
27240 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
27250 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  ount for page pP
27260 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
27270 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
27280 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  e *pPg){.  sqlit
27290 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29  e3PcacheRef(pPg)
272a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
272b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  the journal. In 
272c0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
272d0 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
272e0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
272f0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
27300 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
27310 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
27320 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
27330 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  of the.** disk a
27340 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  nd can be restor
27350 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
27360 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
27370 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
27380 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f   If the Pager.no
27390 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
273a0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
273b0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
273c0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
273d0 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
273e0 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
273f0 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61  e journal-mode a
27400 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63  nd the .** devic
27410 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
27420 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79  s of the file-sy
27430 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
27440 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
27450 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27460 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
27470 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
27480 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
27490 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
274a0 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
274b0 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
274c0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
274d0 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
274e0 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
274f0 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
27500 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
27510 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
27520 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
27530 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
27540 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
27550 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
27560 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
27570 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
27580 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
27590 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
275a0 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
275b0 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
275c0 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
275d0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
275e0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
275f0 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
27600 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
27610 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
27620 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
27630 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
27640 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
27650 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
27660 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
27670 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
27680 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
27690 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
276a0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
276b0 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
276c0 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
276d0 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
276e0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
276f0 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
27700 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
27710 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
27720 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
27730 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
27740 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
27750 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
27760 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
27770 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
27780 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
27790 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  rs the PGHDR_NEE
277a0 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65  D_SYNC flag of e
277b0 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75  very .** page cu
277c0 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20  rrently held in 
277d0 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65  memory before re
277e0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
277f0 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65  K. If an IO.** e
27800 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
27810 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  red, then the IO
27820 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
27830 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
27840 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
27850 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
27860 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
27870 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69  int newHdr){.  i
27880 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
27890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
278a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
278b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
278c0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
278d0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
278e0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
278f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
27900 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
27910 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
27920 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
27930 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
27940 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
27950 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
27960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27970 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
27980 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
27990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
279a0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
279b0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
279c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
279d0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
279e0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
279f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27a00 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
27a10 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
27a20 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
27a30 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Y ){.      const
27a40 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
27a50 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
27a60 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
27a70 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
27a80 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
27a90 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
27aa0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
27ab0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
27ac0 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
27ad0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
27ae0 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
27af0 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
27b00 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
27b10 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
27b20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
27b30 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
27b40 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
27b50 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
27b60 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
27b70 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
27b80 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
27b90 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
27ba0 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
27bb0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
27bc0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
27bd0 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
27be0 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
27bf0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
27c00 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
27c10 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
27c20 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
27c30 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
27c40 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
27c50 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20  us connection's 
27c60 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
27c70 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
27c80 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
27c90 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
27ca0 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
27cb0 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
27cc0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
27cd0 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
27ce0 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
27cf0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
27d00 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
27d10 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
27d20 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
27d30 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
27d40 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
27d50 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
27d60 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
27d70 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
27d80 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
27d90 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
27da0 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
27db0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
27dc0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
27dd0 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
27de0 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
27df0 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
27e00 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
27e10 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
27e20 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
27e30 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
27e40 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
27e50 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
27e60 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
27e70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
27e80 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
27e90 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
27ea0 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
27eb0 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
27ec0 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
27ed0 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
27ee0 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
27ef0 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
27f00 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
27f10 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
27f20 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
27f30 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
27f40 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
27f50 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
27f60 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
27f70 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
27f80 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
27f90 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
27fa0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
27fb0 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
27fc0 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
27fd0 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
27fe0 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
27ff0 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
28000 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
28010 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
28020 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
28030 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28040 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
28050 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
28060 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20  8 aMagic[8];.   
28070 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b       u8 zHeader[
28080 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
28090 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20  agic)+4];..     
280a0 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
280b0 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
280c0 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
280d0 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
280e0 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
280f0 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
28100 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
28110 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
28120 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
28130 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
28140 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
28150 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28160 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
28170 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
28180 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
28190 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
281a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
281b0 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
281c0 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
281d0 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
281e0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
281f0 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
28200 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28210 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
28220 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
28230 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
28240 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
28250 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
28260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
28270 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
28280 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
28290 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
282a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
282b0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
282c0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
282d0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
282e0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
282f0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
28300 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
28310 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
28320 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
28330 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
28340 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
28350 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
28360 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
28370 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
28380 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
28390 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
283a0 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
283b0 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
283c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
283d0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
283e0 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
283f0 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
28400 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
28410 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
28420 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
28430 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
28440 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
28450 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
28460 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
28470 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
28480 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
28490 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
284a0 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
284b0 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
284c0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
284d0 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
284e0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
284f0 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
28500 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
28510 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
28520 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
28530 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
28540 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
28550 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
28560 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28570 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
28580 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
28590 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
285a0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
285b0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
285c0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
285d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
285e0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
285f0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
28600 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
28610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28620 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
28630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
28640 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
28650 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
28660 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
28670 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  lHdr));.        
28680 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
28690 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ite(.           
286a0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48   pPager->jfd, zH
286b0 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
286c0 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e  eader), pPager->
286d0 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
286e0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
286f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28700 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
28710 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
28720 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
28730 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
28740 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
28750 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
28760 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
28770 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
28780 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
28790 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
287a0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
287b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
287c0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
287d0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
287e0 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
287f0 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  (pPager->syncFla
28800 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
28810 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
28820 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
28830 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
28840 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28850 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
28860 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
28870 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
28880 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
28890 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28  alOff;.      if(
288a0 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69   newHdr && 0==(i
288b0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
288c0 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
288d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
288e0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
288f0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
28900 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
28910 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28920 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28930 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
28940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28950 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
28960 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
28970 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
28980 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20   }..  /* Unless 
28990 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
289a0 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  noSync mode, the
289b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61   journal file wa
289c0 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63  s just .  ** suc
289d0 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
289e0 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c  . Either way, cl
289f0 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
28a00 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
28a10 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e  .  ** all pages.
28a20 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
28a30 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
28a40 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
28a50 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  che);.  pPager->
28a60 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
28a70 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61  RITER_DBMOD;.  a
28a80 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
28a90 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
28aa0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
28ab0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
28ac0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
28ad0 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
28ae0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
28af0 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e  dirty pages conn
28b00 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ected.** by the 
28b10 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
28b20 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  nter. This funct
28b30 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20  ion writes each 
28b40 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  one of the.** in
28b50 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e  -memory pages in
28b60 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65   the list to the
28b70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
28b80 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  The argument may
28b90 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70  .** be NULL, rep
28ba0 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70  resenting an emp
28bb0 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73  ty list. In this
28bc0 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
28bd0 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ion is.** a no-o
28be0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  p..**.** The pag
28bf0 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20  er must hold at 
28c00 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
28c10 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20   lock when this 
28c20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
28c30 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72  alled. Before wr
28c40 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74  iting anything t
28c50 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
28c60 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a  ile, this lock.*
28c70 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  * is upgraded to
28c80 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
28c90 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
28ca0 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
28cb0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed,.** SQLITE_BU
28cc0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SY is returned a
28cd0 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72  nd no data is wr
28ce0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
28cf0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
28d00 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
28d10 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70  is a temp-file p
28d20 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74  ager and the act
28d30 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ual file-system 
28d40 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79  file.** is not y
28d50 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63  et open, it is c
28d60 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
28d70 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
28d80 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  a is .** written
28d90 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65   out..**.** Once
28da0 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
28db0 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c  en upgraded and,
28dc0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
28dd0 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a  he file opened,.
28de0 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65  ** the pages are
28df0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
28e00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28e10 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e  e in list order.
28e20 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61   Writing.** a pa
28e30 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ge is skipped if
28e40 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72   it meets either
28e50 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
28e60 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a  g criteria:.**.*
28e70 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e  *   * The page n
28e80 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
28e90 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
28ea0 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68  ze, or.**   * Th
28eb0 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
28ec0 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
28ed0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
28ee0 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74  * If writing out
28ef0 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74   a page causes t
28f00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28f10 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e   to grow, Pager.
28f20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73  dbFileSize.** is
28f30 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
28f40 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20  ngly. If page 1 
28f50 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20  is written out, 
28f60 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63  then the value c
28f70 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65  ached.** in Page
28f80 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
28f90 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74  s updated to mat
28fa0 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ch the new value
28fb0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
28fc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
28fd0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
28fe0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
28ff0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
29000 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
29010 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
29020 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
29030 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
29040 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45  ed. Or, if the E
29050 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61  XCLUSIVE lock ca
29060 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69  nnot.** be obtai
29070 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ned, SQLITE_BUSY
29080 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
29090 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
290a0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
290b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
290c0 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
290d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
290e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
290f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29100 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
29110 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
29120 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72  nly called for r
29130 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69  ollback pagers i
29140 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73  n WRITER_DBMOD s
29150 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tate. */.  asser
29160 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
29170 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
29180 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
29190 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
291a0 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73  R_DBMOD );.  ass
291b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
291c0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
291d0 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
291e0 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
291f0 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
29200 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
29210 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
29220 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
29230 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
29240 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
29250 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
29260 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
29270 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
29280 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
29290 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
292a0 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
292b0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
292c0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
292d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
292e0 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
292f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
29300 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
29310 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
29320 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
29330 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
29340 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
29350 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
29360 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
29370 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
29380 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
29390 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
293a0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
293b0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
293c0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
293d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
293e0 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72  OK .   && pPager
293f0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61  ->dbHintSize<pPa
29400 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26  ger->dbSize.   &
29410 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  & (pList->pDirty
29420 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e   || pList->pgno>
29430 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
29440 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ze).  ){.    sql
29450 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
29460 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
29470 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
29480 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
29490 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
294a0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
294b0 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
294c0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
294d0 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b  _HINT, &szFile);
294e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48  .    pPager->dbH
294f0 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  intSize = pPager
29500 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ->dbSize;.  }.. 
29510 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
29520 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
29530 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
29540 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
29550 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
29560 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
29570 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
29580 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
29590 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
295a0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
295b0 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
295c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
295d0 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
295e0 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
295f0 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
29600 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
29610 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
29620 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
29630 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
29640 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
29650 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
29660 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
29670 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
29680 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
29690 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
296a0 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
296b0 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
296c0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
296d0 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
296e0 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
296f0 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
29700 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
29710 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
29720 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
29730 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
29740 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
29750 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66  geSize;   /* Off
29760 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  set to write */.
29770 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
29780 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
29790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297a0 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20       /* Data to 
297b0 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20  write */    ..  
297c0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69      assert( (pLi
297d0 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
297e0 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
297f0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
29800 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
29810 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
29820 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20  unter(pList);.. 
29830 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74       /* Encode t
29840 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
29850 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
29860 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
29870 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72  , pgno, 6, retur
29880 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
29890 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  pData);..      /
298a0 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20  * Write out the 
298b0 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20  page data. */.  
298c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
298d0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
298e0 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
298f0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
29900 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  set);..      /* 
29910 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75  If page 1 was ju
29920 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  st written, upda
29930 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  te Pager.dbFileV
29940 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20  ers to match.   
29950 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
29960 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68  now stored in th
29970 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29980 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73   If writing this
29990 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20   .      ** page 
299a0 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62  caused the datab
299b0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
299c0 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53  , update dbFileS
299d0 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ize. .      */. 
299e0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31       if( pgno==1
299f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
29a00 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
29a10 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
29a20 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
29a30 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
29a40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29a50 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
29a60 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
29a70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
29a80 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
29a90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
29aa0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
29ab0 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b  ER_STAT_WRITE]++
29ac0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
29ad0 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
29ae0 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
29af0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
29b00 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
29b10 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
29b20 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
29b30 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
29b40 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
29b50 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
29b60 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
29b70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
29b80 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
29b90 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
29ba0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
29bb0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
29bc0 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
29bd0 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
29be0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
29bf0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
29c00 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
29c10 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
29c20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73  count);.    }els
29c30 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
29c40 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
29c50 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
29c60 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
29c70 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
29c80 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
29c90 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  sh(pList);.    p
29ca0 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
29cb0 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  irty;.  }..  ret
29cc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29cd0 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   Ensure that the
29ce0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
29cf0 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74  e is open. If it
29d00 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
29d10 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
29d20 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
29d30 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
29d40 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
29d50 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
29d60 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
29d70 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  . An .** SQLITE_
29d80 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
29d90 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
29da0 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   if a call to sq
29db0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a  lite3OsOpen() .*
29dc0 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * fails..*/.stat
29dd0 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
29de0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
29df0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
29e00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
29e10 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
29e20 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  ->sjfd) ){.    i
29e30 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
29e40 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
29e50 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
29e60 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
29e70 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
29e80 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
29e90 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
29ea0 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
29eb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
29ec0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
29ed0 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
29ee0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
29ef0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
29f00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
29f20 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
29f30 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
29f40 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
29f50 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
29f60 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  ** It is the cal
29f70 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
29f80 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52  ity to use subjR
29f90 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f  equiresPage() to
29fa0 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20   check .** that 
29fb0 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71  it is really req
29fc0 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c  uired before cal
29fd0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
29fe0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  on..**.** If suc
29ff0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
2a000 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
2a010 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20  ng to pPg->pgno 
2a020 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a  in the bitvecs.*
2a030 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73  * for all open s
2a040 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65  avepoints before
2a050 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
2a060 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2a070 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
2a080 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
2a090 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
2a0a0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  n IO.** error co
2a0b0 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  de if the attemp
2a0c0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
2a0d0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61  e sub-journal fa
2a0e0 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49  ils, or .** SQLI
2a0f0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
2a100 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65  lloc fails while
2a110 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69   setting a bit i
2a120 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  n a savepoint.**
2a130 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74   bitvec..*/.stat
2a140 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
2a150 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  lPage(PgHdr *pPg
2a160 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2a170 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
2a180 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2a190 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
2a1a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2a1b0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
2a1c0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20  MODE_OFF ){..   
2a1d0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
2a1e0 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
2a1f0 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
2a200 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  been opened */. 
2a210 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a220 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
2a230 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
2a240 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2a250 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28   || pagerUseWal(
2a260 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61  pPager) );.    a
2a270 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2a280 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70  ager->sjfd) || p
2a290 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d  Pager->nSubRec==
2a2a0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2a2b0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2a2c0 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ger) .         |
2a2d0 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  | pageInJournal(
2a2e0 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
2a2f0 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
2a300 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
2a310 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2a320 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2a330 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
2a340 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
2a350 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
2a360 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
2a370 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
2a380 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
2a390 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
2a3a0 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
2a3b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2a3c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a3d0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
2a3e0 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2a3f0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2a400 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
2a410 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
2a420 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
2a430 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2a440 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
2a450 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
2a460 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
2a470 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2a480 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2a490 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2a4a0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
2a4b0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2a4c0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2a4d0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
2a4e0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2a4f0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
2a500 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
2a510 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2a520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a530 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a540 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2a550 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
2a560 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2a570 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
2a580 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2a590 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a5a0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2a5b0 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
2a5c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2a5d0 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
2a5e0 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
2a5f0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2a600 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2a610 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a620 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2a630 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2a640 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
2a650 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
2a660 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
2a670 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
2a680 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
2a690 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
2a6a0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
2a6b0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
2a6c0 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
2a6d0 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
2a6e0 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
2a6f0 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
2a700 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
2a710 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2a720 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
2a730 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
2a740 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
2a750 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
2a760 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
2a770 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
2a780 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
2a790 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2a7a0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
2a7b0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
2a7c0 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
2a7d0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
2a7e0 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
2a7f0 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
2a800 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
2a810 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
2a820 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
2a830 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
2a840 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
2a850 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
2a860 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
2a870 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
2a880 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
2a890 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2a8a0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
2a8b0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
2a8c0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2a8d0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2a8e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2a8f0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
2a900 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
2a910 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
2a920 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2a930 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
2a940 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
2a950 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
2a960 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
2a970 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
2a980 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2a990 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2a9a0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
2a9b0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
2a9c0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
2a9d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2a9e0 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
2a9f0 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
2aa00 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2aa10 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
2aa20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2aa30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
2aa40 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
2aa50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2aa60 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
2aa70 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
2aa80 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53  e doNotSpill NOS
2aa90 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64  YNC bit is set d
2aaa0 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e  uring times when
2aab0 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66   doing a sync of
2aac0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  .  ** journal (a
2aad0 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20  nd adding a new 
2aae0 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61  header) is not a
2aaf0 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63  llowed.  This oc
2ab00 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
2ab10 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
2ab20 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68  3PagerWrite() wh
2ab30 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f  ile trying to jo
2ab40 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20  urnal multiple. 
2ab50 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67   ** pages belong
2ab60 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ing to the same 
2ab70 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  sector..  **.  *
2ab80 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
2ab90 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46   ROLLBACK and OF
2aba0 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20  F bits inhibits 
2abb0 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69  all cache spilli
2abc0 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65  ng.  ** regardle
2abd0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
2abe0 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72   not a sync is r
2abf0 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69  equired.  This i
2ac00 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a  s set during.  *
2ac10 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  * a rollback or 
2ac20 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c  by user request,
2ac30 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
2ac40 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e   **.  ** Spillin
2ac50 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62  g is also prohib
2ac60 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20  ited when in an 
2ac70 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63  error state sinc
2ac80 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a  e that could.  *
2ac90 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  * lead to databa
2aca0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
2acb0 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
2acc0 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69 74  implementaton it
2acd0 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73   .  ** is imposs
2ace0 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ible for sqlite3
2acf0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f  PcacheFetch() to
2ad00 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
2ad10 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20 20  createFlag==1.  
2ad20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  ** while in the 
2ad30 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e  error state, hen
2ad40 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  ce it is impossi
2ad50 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
2ad60 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20  tine to.  ** be 
2ad70 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72  called in the er
2ad80 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65  ror state.  Neve
2ad90 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63  rtheless, we inc
2ada0 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20  lude a NEVER(). 
2adb0 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65   ** test for the
2adc0 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20   error state as 
2add0 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69  a safeguard agai
2ade0 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67  nst future chang
2adf0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  es..  */.  if( N
2ae00 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
2ae10 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53  Code) ) return S
2ae20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74  QLITE_OK;.  test
2ae30 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2ae40 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2ae50 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  FLAG_ROLLBACK );
2ae60 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2ae70 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2ae80 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20  & SPILLFLAG_OFF 
2ae90 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2aea0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2aeb0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  l & SPILLFLAG_NO
2aec0 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50  SYNC );.  if( pP
2aed0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2aee0 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d  .   && ((pPager-
2aef0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53  >doNotSpill & (S
2af00 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2af10 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29  K|SPILLFLAG_OFF)
2af20 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70  )!=0.      || (p
2af30 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
2af40 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29  R_NEED_SYNC)!=0)
2af50 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2af60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2af70 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
2af80 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55   0;.  if( pagerU
2af90 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
2afa0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  .    /* Write a 
2afb0 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72  single frame for
2afc0 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68   this page to th
2afd0 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66  e log. */.    if
2afe0 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
2aff0 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20  ge(pPg) ){ .    
2b000 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
2b010 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20  lPage(pPg); .   
2b020 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2b030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b040 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46    rc = pagerWalF
2b050 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50  rames(pPager, pP
2b060 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  g, 0, 0);.    }.
2b070 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
2b080 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
2b090 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
2b0a0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
2b0b0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2b0c0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20  R_NEED_SYNC .   
2b0d0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
2b0e0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
2b0f0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29  R_CACHEMOD.    )
2b100 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
2b110 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
2b120 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   1);.    }.  .  
2b130 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
2b140 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20   number of this 
2b150 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74  page is larger t
2b160 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
2b170 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  size of.    ** t
2b180 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2b190 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74  e, it may need t
2b1a0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  o be written to 
2b1b0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
2b1c0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
2b1d0 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
2b1e0 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f   to pager_write_
2b1f0 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77  pagelist() below
2b200 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a   will not.    **
2b210 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20   actually write 
2b220 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
2b230 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
2b240 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e     **.    ** Con
2b250 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
2b260 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
2b270 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20  events:.    **. 
2b280 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20     **   BEGIN;. 
2b290 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e     **     <journ
2b2a0 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  al page X>.    *
2b2b0 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61  *     <modify pa
2b2c0 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
2b2d0 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20   SAVEPOINT sp;. 
2b2e0 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72     **       <shr
2b2f0 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ink database fil
2b300 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20  e to Y pages>.  
2b310 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
2b320 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
2b330 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41     **     ROLLBA
2b340 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a  CK TO sp;.    **
2b350 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29  .    ** If (X>Y)
2b360 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65  , then when page
2b370 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65  rStress is calle
2b380 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f  d page X will no
2b390 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20  t be written.   
2b3a0 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64   ** out to the d
2b3b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75  atabase file, bu
2b3c0 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  t will be droppe
2b3d0 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
2b3e0 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66  . Then,.    ** f
2b3f0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f  ollowing the "RO
2b400 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74  LLBACK TO sp" st
2b410 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67  atement, reading
2b420 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61   page X will rea
2b430 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72  d.    ** data fr
2b440 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2b450 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  file. This will 
2b460 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70  be the copy of p
2b470 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20  age X as it.    
2b480 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  ** was when the 
2b490 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
2b4a0 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77  ted, not as it w
2b4b0 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49  as when "SAVEPOI
2b4c0 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61  NT sp".    ** wa
2b4d0 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  s executed..    
2b4e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
2b4f0 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69  lution is to wri
2b500 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  te the current d
2b510 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69  ata for page X i
2b520 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
2b530 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
2b540 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e   now (if it is n
2b550 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65  ot already there
2b560 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ), so that it wi
2b570 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73  ll.    ** be res
2b580 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72  tored to its cur
2b590 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20  rent value when 
2b5a0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
2b5b0 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20   sp" is .    ** 
2b5c0 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f  executed..    */
2b5d0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a  .    if( NEVER(.
2b5e0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
2b5f0 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67  TE_OK && pPg->pg
2b600 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
2b610 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65  e && subjRequire
2b620 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29  sPage(pPg).    )
2b630 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2b640 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
2b650 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  g);.    }.  .   
2b660 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
2b670 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2b680 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
2b690 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2b6a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b6b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2b6c0 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
2b6d0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2b6e0 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
2b6f0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2b700 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
2b710 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  , pPg);.    }.  
2b720 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
2b730 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
2b740 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2b750 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
2b760 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
2b770 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
2b780 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2b790 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2b7a0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2b7b0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
2b7c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
2b7d0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
2b7e0 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  , rc); .}.../*.*
2b7f0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2b800 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2b810 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2b820 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2b830 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2b840 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2b850 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2b860 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2b870 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2b880 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2b890 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2b8a0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2b8b0 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2b8c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b8d0 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2b8e0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2b8f0 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2b900 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2b910 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2b920 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2b930 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2b940 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2b950 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2b960 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2b970 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2b980 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2b990 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2b9a0 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2b9b0 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2b9c0 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2b9d0 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2b9e0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2b9f0 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2ba00 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2ba10 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2ba20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2ba30 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2ba40 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2ba50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2ba60 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2ba70 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2ba80 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2ba90 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2baa0 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2bab0 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2bac0 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2bad0 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2bae0 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
2baf0 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
2bb00 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
2bb10 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
2bb20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
2bb30 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
2bb40 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
2bb50 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
2bb60 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
2bb70 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
2bb80 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  ER_* flags..**.*
2bb90 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
2bba0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
2bbb0 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
2bbc0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2bbd0 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
2bbe0 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
2bbf0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
2bc00 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
2bc10 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
2bc20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2bc30 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2bc40 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
2bc50 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
2bc60 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
2bc70 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2bc80 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
2bc90 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2bca0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
2bcb0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
2bcc0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2bcd0 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
2bce0 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
2bcf0 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
2bd00 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2bd10 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2bd20 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
2bd30 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
2bd40 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
2bd50 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
2bd60 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
2bd70 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
2bd80 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
2bd90 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2bda0 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
2bdb0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2bdc0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2bdd0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2bde0 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2bdf0 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2be00 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2be10 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2be20 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2be30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2be40 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2be50 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2be60 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2be70 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2be80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2be90 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2bea0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2beb0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2bec0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2bed0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2bee0 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2bef0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2bf00 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2bf10 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2bf20 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2bf30 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2bf40 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2bf50 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2bf60 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2bf70 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2bf80 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2bf90 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2bfa0 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2bfb0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2bfc0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2bfd0 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2bfe0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2bff0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2c000 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2c010 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2c020 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2c030 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2c040 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2c050 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2c060 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2c070 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2c080 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2c090 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
2c0a0 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2c0b0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2c0c0 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2c0d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2c0e0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2c0f0 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2c100 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2c110 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2c120 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2c130 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2c140 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2c150 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2c160 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2c170 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c180 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2c190 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2c1a0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2c1b0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2c1c0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2c1d0 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2c1e0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70  urnal */.  int p
2c1f0 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
2c200 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
2c210 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2c220 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2c230 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20  PCache */.  u32 
2c240 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2c250 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2c260 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
2c270 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
2c280 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
2c290 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52  ri = 0;    /* UR
2c2a0 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a  I args to copy *
2c2b0 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30  /.  int nUri = 0
2c2c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2c2d0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2c2e0 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a  of URI args at *
2c2f0 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  zUri */..  /* Fi
2c300 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
2c310 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
2c320 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
2c330 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
2c340 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
2c350 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
2c360 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
2c370 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
2c380 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
2c390 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
2c3a0 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
2c3b0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
2c3c0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2c3d0 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
2c3e0 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
2c3f0 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
2c400 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
2c410 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
2c420 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
2c430 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
2c440 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
2c450 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
2c460 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
2c470 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
2c480 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
2c490 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2c4a0 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
2c4b0 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
2c4c0 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
2c4d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
2c4e0 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
2c4f0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
2c500 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
2c510 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2c520 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
2c530 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2c540 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c550 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2c560 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2c570 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
2c580 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
2c590 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
2c5a0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
2c5b0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
2c5c0 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
2c5d0 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65  ger = 0;..#ifnde
2c5e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
2c5f0 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61  MORYDB.  if( fla
2c600 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52  gs & PAGER_MEMOR
2c610 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d  Y ){.    memDb =
2c620 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c   1;.    if( zFil
2c630 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2c640 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  me[0] ){.      z
2c650 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c660 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46  e3DbStrDup(0, zF
2c670 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2c680 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2c690 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54    ) return SQLIT
2c6a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e  E_NOMEM;.      n
2c6b0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c6c0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2c6d0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69  name);.      zFi
2c6e0 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  lename = 0;.    
2c6f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2c700 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
2c710 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
2c720 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
2c730 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
2c740 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
2c750 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
2c760 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
2c770 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
2c780 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
2c790 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
2c7a0 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
2c7b0 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
2c7c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2c7d0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2c7e0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e  me[0] ){.    con
2c7f0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
2c800 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
2c810 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2c820 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2c830 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
2c840 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a  aw(0, nPathname*
2c850 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  2);.    if( zPat
2c860 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  hname==0 ){.    
2c870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c880 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
2c890 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
2c8a0 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
2c8b0 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
2c8c0 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
2c8d0 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
2c8e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
2c8f0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
2c900 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
2c910 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
2c920 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  );.    nPathname
2c930 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2c940 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2c950 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a     z = zUri = &z
2c960 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33  Filename[sqlite3
2c970 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
2c980 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c  me)+1];.    whil
2c990 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a  e( *z ){.      z
2c9a0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2c9b0 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20  n30(z)+1;.      
2c9c0 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2c9d0 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d  en30(z)+1;.    }
2c9e0 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74  .    nUri = (int
2c9f0 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b  )(&z[1] - zUri);
2ca00 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72  .    assert( nUr
2ca10 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
2ca20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2ca30 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2ca40 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2ca50 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2ca60 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2ca70 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2ca80 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2ca90 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2caa0 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2cab0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2cac0 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2cad0 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2cae0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2caf0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2cb00 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2cb10 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2cb20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2cb30 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2cb40 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2cb50 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2cb60 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2cb70 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2cb80 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2cb90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2cba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2cbb0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2cbc0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2cbd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cbe0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2cbf0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2cc00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2cc10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
2cc20 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
2cc30 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
2cc40 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
2cc50 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
2cc60 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
2cc70 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
2cc80 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
2cc90 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
2cca0 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
2ccb0 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
2ccc0 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
2ccd0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2cce0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd00 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
2cd10 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2cd20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
2cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd40 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
2cd50 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
2cd60 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2cd70 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2cd80 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
2cd90 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
2cda0 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
2cdb0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2cdc0 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2cdd0 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2cde0 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
2cdf0 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2ce00 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2ce10 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2ce20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2ce30 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2ce40 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2ce50 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
2ce60 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
2ce70 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2ce80 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
2ce90 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
2cea0 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
2ceb0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2cec0 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
2ced0 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
2cee0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
2cef0 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
2cf00 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2cf10 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
2cf20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
2cf30 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
2cf40 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
2cf50 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2cf60 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
2cf70 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
2cf80 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
2cf90 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
2cfa0 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
2cfb0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2cfc0 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  Uri +         /*
2cfd0 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
2cfe0 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
2cff0 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20  + 2             
2d000 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
2d010 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d020 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50  MIT_WAL.    + nP
2d030 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20  athname + 4 + 2 
2d040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57             /* zW
2d050 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29  al */.#endif.  )
2d060 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2d070 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2d080 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
2d090 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
2d0a0 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
2d0b0 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
2d0c0 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2d0d0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
2d0e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d0f0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
2d100 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
2d110 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
2d120 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
2d130 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
2d140 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
2d150 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
2d160 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
2d170 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d180 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2d190 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
2d1a0 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
2d1b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d1c0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
2d1d0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
2d1e0 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
2d1f0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d200 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2d210 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
2d220 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
2d230 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
2d240 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2d250 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
2d260 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2d270 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
2d280 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
2d290 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
2d2a0 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
2d2b0 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
2d2c0 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
2d2d0 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
2d2e0 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
2d2f0 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b  ( nPathname>0 );
2d300 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
2d310 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
2d320 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
2d330 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b  ame + 1 + nUri);
2d340 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2d350 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
2d360 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2d370 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55  ame);.    if( nU
2d380 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61  ri ) memcpy(&pPa
2d390 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
2d3a0 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72  Pathname+1], zUr
2d3b0 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65  i, nUri);.    me
2d3c0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
2d3d0 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  urnal, zPathname
2d3e0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2d3f0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2d400 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
2d410 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  name], "-journal
2d420 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20  \000", 8+2);.   
2d430 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2d440 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2d450 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2d460 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65  Journal);.#ifnde
2d470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2d480 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57  L.    pPager->zW
2d490 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a  al = &pPager->zJ
2d4a0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2d4b0 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  +8+1];.    memcp
2d4c0 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  y(pPager->zWal, 
2d4d0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2d4e0 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2d4f0 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b  y(&pPager->zWal[
2d500 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61  nPathname], "-wa
2d510 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20  l\000", 4+1);.  
2d520 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2d530 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2d540 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2d550 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  zWal);.#endif.  
2d560 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d570 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2d580 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66   }.  pPager->pVf
2d590 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67  s = pVfs;.  pPag
2d5a0 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
2d5b0 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f  fsFlags;..  /* O
2d5c0 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
2d5d0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  le..  */.  if( z
2d5e0 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2d5f0 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2d600 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20  int fout = 0;   
2d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d620 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65   /* VFS flags re
2d630 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28  turned by xOpen(
2d640 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ) */.    rc = sq
2d650 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
2d660 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2d670 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
2d680 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74   vfsFlags, &fout
2d690 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2d6a0 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61  memDb );.    rea
2d6b0 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
2d6c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2d6d0 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
2d6e0 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
2d6f0 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
2d700 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
2d710 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
2d720 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
2d730 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
2d740 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
2d750 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
2d760 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
2d770 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2d780 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
2d790 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
2d7a0 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
2d7b0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d7c0 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
2d7d0 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
2d7e0 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
2d7f0 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
2d800 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
2d810 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
2d820 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
2d830 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
2d840 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2d850 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
2d860 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
2d870 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2d880 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
2d890 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
2d8a0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
2d8b0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2d8c0 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
2d8d0 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
2d8e0 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
2d8f0 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
2d900 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
2d910 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
2d920 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2d930 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
2d940 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
2d950 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2d960 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
2d970 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d980 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2d990 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
2d9a0 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
2d9b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
2d9c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2d9d0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2d9e0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2d9f0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
2da00 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2da10 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2da20 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >fd);.        in
2da30 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73  t ii;.        as
2da40 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2da50 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
2da60 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
2da70 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2da80 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
2da90 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
2daa0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2dab0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2dac0 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
2dad0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
2dae0 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
2daf0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2db00 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
2db10 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
2db20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
2db30 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
2db40 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
2db50 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2db60 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
2db70 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2db80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2db90 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2dba0 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
2dbb0 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
2dbc0 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
2dbd0 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
2dbe0 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
2dbf0 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
2dc00 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
2dc10 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
2dc20 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
2dc30 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
2dc40 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
2dc50 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
2dc60 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
2dc70 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
2dc80 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
2dc90 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2dca0 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
2dcb0 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
2dcc0 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
2dcd0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
2dce0 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
2dcf0 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
2dd00 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
2dd10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
2dd20 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
2dd30 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
2dd40 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
2dd50 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2dd60 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20  GER_READER;.    
2dd70 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
2dd80 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
2dd90 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2dda0 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
2ddb0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2ddc0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
2ddd0 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20  llowing call to 
2dde0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2ddf0 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74  () serves to set
2de00 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20   the value of . 
2de10 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   ** Pager.pageSi
2de20 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61  ze and to alloca
2de30 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d  te the Pager.pTm
2de40 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
2de50 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2de60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2de70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
2de80 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72  emDb==0 );.    r
2de90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2dea0 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
2deb0 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c  er, &szPageDflt,
2dec0 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
2ded0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
2dee0 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  K );.  }..  /* I
2def0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2df00 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
2df10 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
2df20 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a  e, free the .  *
2df30 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
2df40 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
2df50 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2df60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2df70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
2df80 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
2df90 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   );.    sqlite3O
2dfa0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
2dfb0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
2dfc0 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
2dfd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2dfe0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
2dff0 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a  e the PCache obj
2e000 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ect. */.  assert
2e010 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b  ( nExtra<1000 );
2e020 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e  .  nExtra = ROUN
2e030 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71  D8(nExtra);.  sq
2e040 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28  lite3PcacheOpen(
2e050 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74  szPageDflt, nExt
2e060 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20  ra, !memDb,.    
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e080 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65  !memDb?pagerStre
2e090 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50  ss:0, (void *)pP
2e0a0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50  ager, pPager->pP
2e0b0 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52  Cache);..  PAGER
2e0c0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
2e0d0 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
2e0e0 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
2e0f0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2e100 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
2e110 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
2e120 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2e130 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
2e140 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2e150 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
2e160 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nal;.  /* pPager
2e170 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
2e180 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e190 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
2e1a0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2e1b0 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Ref = 0; */.  /*
2e1c0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
2e1d0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2e1e0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
2e1f0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e200 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
2e210 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
2e220 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
2e230 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
2e240 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
2e250 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
2e260 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
2e270 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2e280 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f  e == (tempFile ?
2e290 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
2e2a0 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29   : PAGER_UNLOCK)
2e2b0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20   );.#endif.  /* 
2e2c0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
2e2d0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2e2e0 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38  ->tempFile = (u8
2e2f0 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73  )tempFile;.  ass
2e300 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
2e310 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2e320 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
2e330 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
2e340 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e350 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
2e360 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2e370 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2e380 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
2e390 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2e3a0 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  de = (u8)tempFil
2e3b0 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  e; .  pPager->ch
2e3c0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2e3d0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e3e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
2e3f0 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
2e400 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
2e410 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
2e420 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  ;.  assert( useJ
2e430 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
2e440 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
2e450 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
2e460 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e470 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
2e480 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
2e490 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
2e4a0 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  ullSync==0 );.  
2e4b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e4c0 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ->syncFlags==0 )
2e4d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2e4e0 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
2e4f0 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2e500 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70  ert( pPager->ckp
2e510 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  tSyncFlags==0 );
2e520 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
2e530 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
2e540 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2e550 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
2e560 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
2e570 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
2e580 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2e590 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20  E_SYNC_NORMAL | 
2e5a0 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
2e5b0 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65  TIONS;.    pPage
2e5c0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2e5d0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2e5e0 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
2e5f0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
2e600 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e610 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
2e620 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e630 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
2e640 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
2e650 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74  xtra = (u16)nExt
2e660 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
2e670 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
2e680 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2e690 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
2e6a0 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  IT;.  assert( is
2e6b0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2e6c0 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a   || tempFile );.
2e6d0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2e6e0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
2e6f0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
2e700 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2e710 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2e720 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20  URNALMODE_OFF;. 
2e730 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62   }else if( memDb
2e740 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2e750 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2e760 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2e770 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a  MEMORY;.  }.  /*
2e780 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
2e790 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
2e7a0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
2e7b0 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20  HandlerArg = 0; 
2e7c0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  */.  pPager->xRe
2e7d0 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
2e7e0 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  ;.  /* memset(pP
2e7f0 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
2e800 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
2e810 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20  Hash)); */.  /* 
2e820 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
2e830 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2e840 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c  MMAP_SIZE // wil
2e850 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65  l be set by btre
2e860 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  e.c */..  *ppPag
2e870 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
2e880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e890 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
2e8a0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
2e8b0 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
2e8c0 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61   deleted or rena
2e8d0 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  med out from.** 
2e8e0 75 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e  under the pager.
2e8f0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2e900 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61  OK if the databa
2e910 73 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65  se is still were
2e920 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20   it ought.** to 
2e930 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74  be on disk.  Ret
2e940 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51  urn non-zero (SQ
2e950 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 44 42 20  LITE_IOERR_NODB 
2e960 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
2e970 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d  ror.** code from
2e980 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2e990 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61 62  ()) if the datab
2e9a0 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73  ase has gone mis
2e9b0 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
2e9c0 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55 6e  int databaseIsUn
2e9d0 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50 61  moved(Pager *pPa
2e9e0 67 65 72 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  ger){.  const in
2e9f0 74 20 66 69 78 65 64 46 6c 61 67 73 20 3d 20 53  t fixedFlags = S
2ea00 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
2ea10 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
2ea20 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  N |.            
2ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2ea40 49 54 45 5f 49 4f 43 41 50 5f 55 4e 4d 4f 56 41  ITE_IOCAP_UNMOVA
2ea50 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 3b 0a 20  BLE_WHEN_OPEN;. 
2ea60 20 69 6e 74 20 64 63 3b 0a 20 20 69 6e 74 20 78   int dc;.  int x
2ea70 20 3d 20 30 2c 20 72 63 3b 0a 0a 20 20 69 66 28   = 0, rc;..  if(
2ea80 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2ea90 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
2eaa0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
2eab0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20  er->dbSize==0 ) 
2eac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ead0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2eae0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26  er->zFilename &&
2eaf0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2eb00 6d 65 5b 30 5d 20 29 3b 0a 20 20 64 63 20 3d 20  me[0] );.  dc = 
2eb10 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2eb20 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2eb30 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 69 66  Pager->fd);.  if
2eb40 28 20 28 64 63 26 66 69 78 65 64 46 6c 61 67 73  ( (dc&fixedFlags
2eb50 29 3d 3d 66 69 78 65 64 46 6c 61 67 73 20 29 20  )==fixedFlags ) 
2eb60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2eb70 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2eb80 4f 73 41 63 63 65 73 73 28 70 50 61 67 65 72 2d  OsAccess(pPager-
2eb90 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
2eba0 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45  Filename, SQLITE
2ebb0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
2ebc0 26 78 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  &x);.  if( rc==S
2ebd0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 78 20 29  QLITE_OK && !x )
2ebe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2ebf0 52 52 5f 4e 4f 44 42 3b 0a 20 20 72 65 74 75 72  RR_NODB;.  retur
2ec00 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2ec10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2ec20 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72   called after tr
2ec30 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
2ec40 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f   PAGER_UNLOCK to
2ec50 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44  .** PAGER_SHARED
2ec60 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73   state. It tests
2ec70 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
2ec80 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65  ot journal prese
2ec90 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c  nt in.** the fil
2eca0 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
2ecb0 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20   given pager. A 
2ecc0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
2ecd0 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64  ne that .** need
2ece0 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
2ecf0 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74  ack. According t
2ed00 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2ed10 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
2ed20 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66  * file exists if
2ed30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2ed40 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a  riteria are met:
2ed50 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a  .**.**   * The j
2ed60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2ed70 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73  ts in the file s
2ed80 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20  ystem, and.**   
2ed90 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c  * No process hol
2eda0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ds a RESERVED or
2edb0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
2edc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2edd0 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  le, and.**   * T
2ede0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2edf0 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74   itself is great
2ee00 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20  er than 0 bytes 
2ee10 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20  in size, and.** 
2ee20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79    * The first by
2ee30 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  te of the journa
2ee40 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
2ee50 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a  d is not 0x00..*
2ee60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
2ee70 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
2ee80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2ee90 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
2eea0 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
2eeb0 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
2eec0 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
2eed0 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
2eee0 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
2eef0 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
2ef00 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e name. In this 
2ef10 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
2ef20 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74   file is.** just
2ef30 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f   deleted using O
2ef40 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74  sDelete, *pExist
2ef50 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  s is set to 0 an
2ef60 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  d SQLITE_OK.** i
2ef70 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
2ef80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
2ef90 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66  oes not check if
2efa0 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74   there is a mast
2efb0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
2efc0 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ame.** at the en
2efd0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49  d of the file. I
2efe0 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20  f there is, and 
2eff0 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  that master jour
2f000 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73  nal file.** does
2f010 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
2f020 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f030 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2f040 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20  hot. In this.** 
2f050 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
2f060 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  e will return a 
2f070 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20  false-positive. 
2f080 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
2f090 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
2f0a0 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68  will discover th
2f0b0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
2f0c0 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
2f0d0 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69  y hot and .** wi
2f0e0 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62  ll not roll it b
2f0f0 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ack. .**.** If a
2f100 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2f110 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78  e is found to ex
2f120 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ist, *pExists is
2f130 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a   set to 1 and .*
2f140 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
2f150 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d  rned. If no hot-
2f160 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f170 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74  present, *pExist
2f180 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  s is.** set to 0
2f190 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
2f1a0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2f1b0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2f1c0 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
2f1d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
2f1e0 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74  her or not a hot
2f1f0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78  -journal file ex
2f200 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72  ists, the IO err
2f210 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65  or.** code is re
2f220 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
2f230 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73  alue of *pExists
2f240 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
2f250 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2f260 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
2f270 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
2f280 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74  Exists){.  sqlit
2f290 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
2f2a0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
2f2b0 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fs;.  int rc = S
2f2c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2f2d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2f2e0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73  de */.  int exis
2f2f0 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ts = 1;         
2f300 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f310 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
2f320 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
2f330 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21  int jrnlOpen = !
2f340 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2f350 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  jfd);..  assert(
2f360 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2f370 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
2f380 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2f390 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
2f3a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2f3b0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a  =PAGER_OPEN );..
2f3c0 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70    assert( jrnlOp
2f3d0 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74  en==0 || ( sqlit
2f3e0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2f3f0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2f400 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c  ->jfd) &.    SQL
2f410 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
2f420 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a  TABLE_WHEN_OPEN.
2f430 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74    ));..  *pExist
2f440 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72  s = 0;.  if( !jr
2f450 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  nlOpen ){.    rc
2f460 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
2f470 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  ss(pVfs, pPager-
2f480 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
2f490 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
2f4a0 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20   &exists);.  }. 
2f4b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f4c0 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a  OK && exists ){.
2f4d0 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d      int locked =
2f4e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f4f0 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20  /* True if some 
2f500 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
2f510 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
2f520 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f  ..    /* Race co
2f530 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41  ndition here:  A
2f540 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
2f550 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68  ight have been h
2f560 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  olding the.    *
2f570 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  * the RESERVED l
2f580 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a  ock and have a j
2f590 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74  ournal open at t
2f5a0 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  he sqlite3OsAcce
2f5b0 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c  ss() .    ** cal
2f5c0 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65  l above, but the
2f5d0 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
2f5e0 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68  rnal and drop th
2f5f0 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20  e lock before.  
2f600 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74    ** we get to t
2f610 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
2f620 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
2f630 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20  vedLock() call. 
2f640 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   If that.    ** 
2f650 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69  is the case, thi
2f660 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2f670 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61  think there is a
2f680 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65   hot journal whe
2f690 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74  n.    ** in fact
2f6a0 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20   there is none. 
2f6b0 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
2f6c0 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
2f6d0 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20  e which will.   
2f6e0 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
2f6f0 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63  h by the playbac
2f700 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b  k routine.  Tick
2f710 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f  et #3883..    */
2f720 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2f730 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2f740 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
2f750 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69   &locked);.    i
2f760 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f770 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20   && !locked ){. 
2f780 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
2f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2f7b0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
2f7c0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  file */..      /
2f7d0 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65  * Check the size
2f7e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f7f0 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e   file. If it con
2f800 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65 73  sists of 0 pages
2f810 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
2f820 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2f830 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65  al file. See the
2f840 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
2f850 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20  above for .     
2f860 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e   ** the reasonin
2f870 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20  g here.  Delete 
2f880 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75  the obsolete jou
2f890 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a  rnal file under.
2f8a0 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52        ** a RESER
2f8b0 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69  VED lock to avoi
2f8c0 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  d race condition
2f8d0 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76  s and to avoid v
2f8e0 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a  iolating.      *
2f8f0 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20  * [H33020]..    
2f900 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2f910 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2f920 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
2f930 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f950 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
2f960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2f970 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
2f980 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2f990 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b     if( pagerLock
2f9a0 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
2f9b0 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54  VED_LOCK)==SQLIT
2f9c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f9d0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
2f9e0 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
2f9f0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
2fa00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2fa10 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
2fa20 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e  veMode ) pagerUn
2fa30 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
2fa40 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
2fa50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fa60 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
2fa70 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
2fa80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2fa90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
2faa0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2fab0 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f   and no other co
2fac0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72  nnection has a r
2fad0 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20  eserved.        
2fae0 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20    ** or greater 
2faf0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2fb00 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63  base file. Now c
2fb10 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20  heck that there 
2fb20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
2fb30 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e  at least one non
2fb40 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74  -zero bytes at t
2fb50 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
2fb60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
2fb70 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
2fb80 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20  ere is, then we 
2fb90 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f  consider this jo
2fba0 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e  urnal to be hot.
2fbb0 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20   If not, .      
2fbc0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
2fbd0 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20   ignored..      
2fbe0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2fbf0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2fc00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2fc10 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
2fc20 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
2fc30 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2fc40 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
2fc50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
2fc60 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
2fc70 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
2fc80 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b  er->jfd, f, &f);
2fc90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fca0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2fcb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fcc0 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74          u8 first
2fcd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2fce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2fcf0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
2fd00 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74  , (void *)&first
2fd10 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
2fd20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2fd30 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
2fd40 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
2fd50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2fd60 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2fd70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2fd80 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
2fd90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2fda0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
2fdb0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
2fdc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fdd0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
2fde0 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
2fdf0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2fe00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
2fe10 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
2fe20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
2fe30 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
2fe40 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
2fe50 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
2fe60 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
2fe70 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a    ** its has a z
2fe80 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
2fe90 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
2fea0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
2feb0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
2fec0 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
2fed0 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
2fee0 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
2fef0 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
2ff00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
2ff10 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
2ff20 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
2ff30 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2ff40 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
2ff50 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
2ff60 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
2ff70 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
2ff80 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
2ff90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
2ffa0 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
2ffb0 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
2ffc0 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
2ffd0 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
2ffe0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
2fff0 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
30000 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
30010 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
30020 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30030 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
30040 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
30050 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
30060 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
30070 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
30080 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
30090 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
300a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
300b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
300c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
300d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
300e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
300f0 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
30100 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
30110 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
30120 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
30130 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
30140 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74  gerAcquire() unt
30150 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
30160 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
30170 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
30180 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
30190 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
301a0 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
301b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
301c0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
301d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
301e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
301f0 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
30200 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
30210 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
30220 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
30230 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
30240 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  y in PAGER_OPEN 
30250 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68  state (no lock h
30260 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  eld.**      on t
30270 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30280 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d  ), then an attem
30290 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62  pt is made to ob
302a0 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53  tain a.**      S
302b0 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
302c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
302d0 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
302e0 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20  er obtaining.** 
302f0 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20       the SHARED 
30300 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73  lock, the file-s
30310 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64  ystem is checked
30320 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
30330 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63  al,.**      whic
30340 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  h is played back
30350 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c   if present. Fol
30360 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a  lowing any hot-j
30370 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20  ournal .**      
30380 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f  rollback, the co
30390 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61  ntents of the ca
303a0 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65  che are validate
303b0 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  d by checking.**
303c0 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67        the 'chang
303d0 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64  e-counter' field
303e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
303f0 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64   file header and
30400 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64  .**      discard
30410 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66  ed if they are f
30420 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  ound to be inval
30430 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49  id..**.**   2) I
30440 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
30450 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
30460 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68  ive-mode, and th
30470 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
30480 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74  y.**      no out
30490 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
304a0 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73  ces to any pages
304b0 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20  , and is in the 
304c0 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20  error state,.** 
304d0 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74       then an att
304e0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
304f0 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
30500 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64  state by discard
30510 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
30520 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
30530 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72  page cache and r
30540 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20  olling back any 
30550 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  open journal.** 
30560 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a       file..**.**
30570 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
30580 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
30590 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
305a0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
305b0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77  ror .** occurs w
305c0 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
305d0 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
305e0 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
305f0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a  urnal file or .*
30600 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  * rolling back a
30610 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
30620 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
30630 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
30640 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
30650 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
30660 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
30670 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
30680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30690 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
306a0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
306b0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
306c0 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
306d0 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
306e0 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
306f0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
30700 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73  es. This implies
30710 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
30720 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74  state should eit
30730 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e  her.  ** be OPEN
30740 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44   or READER. READ
30750 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  ER is only possi
30760 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72  ble if the pager
30770 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20   is or was in . 
30780 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63   ** exclusive ac
30790 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a  cess mode..  */.
307a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
307b0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
307c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
307d0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
307e0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
307f0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
30800 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30810 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
30820 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
30830 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
30840 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  DER );.  if( NEV
30850 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ER(MEMDB && pPag
30860 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20  er->errCode) ){ 
30870 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
30880 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28  rrCode; }..  if(
30890 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
308a0 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
308b0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
308c0 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  PEN ){.    int b
308d0 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20  HotJournal = 1; 
308e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
308f0 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
30900 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66   a hot journal-f
30910 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ile */..    asse
30920 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20  rt( !MEMDB );.. 
30930 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
30940 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
30950 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
30960 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
30970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30980 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30990 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock==NO_LOCK |
309a0 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
309b0 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
309c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
309d0 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
309e0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
309f0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 75 6e  e database is un
30a00 6d 6f 76 65 64 20 61 6e 64 20 75 6e 64 65 6c 65  moved and undele
30a10 74 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ted */.    rc = 
30a20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
30a30 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  d(pPager);.    i
30a40 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69  f( rc ) goto fai
30a50 6c 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  led;..    /* If 
30a60 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
30a70 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
30a80 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
30a90 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
30aa0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
30ab0 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
30ac0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
30ad0 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
30ae0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
30af0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
30b00 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
30b10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
30b20 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
30b30 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
30b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30b50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30b60 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
30b70 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
30b80 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
30b90 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
30ba0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
30bb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30bc0 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
30bd0 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f  BACK;.        go
30be0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
30bf0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74   }..      /* Get
30c00 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
30c10 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
30c20 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
30c30 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
30c40 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20     ** important 
30c50 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20  that a RESERVED 
30c60 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61  lock is not obta
30c70 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20  ined on the way 
30c80 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
30c90 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
30ca0 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
30cb0 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
30cc0 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
30cd0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
30ce0 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
30cf0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
30d00 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
30d10 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
30d20 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
30d30 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
30d40 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
30d50 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20   rolling the .  
30d60 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
30d70 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  al back..      *
30d80 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61  * .      ** Beca
30d90 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
30da0 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
30db0 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
30dc0 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a  ted, any.      *
30dd0 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  * other process 
30de0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63  attempting to ac
30df0 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
30e00 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20  e file will get 
30e10 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  to .      ** thi
30e20 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
30e30 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20  ode and fail to 
30e40 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45  obtain its own E
30e50 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20  XCLUSIVE lock . 
30e60 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
30e70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
30e80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
30e90 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
30ea0 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d   is in locking_m
30eb0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
30ec0 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a  de, the lock is.
30ed0 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61        ** downgra
30ee0 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f  ded to SHARED_LO
30ef0 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  CK before this f
30f00 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
30f10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30f20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
30f30 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
30f40 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
30f50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30f60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
30f70 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
30f80 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  }. .      /* If 
30f90 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
30fa0 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66  y open and the f
30fb0 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ile exists on di
30fc0 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20  sk, open the .  
30fd0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
30fe0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
30ff0 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65  cess. Write acce
31000 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ss is required b
31010 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a  ecause .      **
31020 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
31030 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
31040 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
31050 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
31060 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f  .      ** and po
31070 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
31080 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
31090 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72  ter on. Also, wr
310a0 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20  ite-access .    
310b0 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20    ** is usually 
310c0 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61  required to fina
310d0 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
310e0 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   in journal_mode
310f0 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20  =persist .      
31100 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73  ** mode (and als
31110 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  o for journal_mo
31120 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73  de=truncate on s
31130 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20  ome systems)..  
31140 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
31150 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64  If the journal d
31160 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69  oes not exist, i
31170 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20  t usually means 
31180 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20  that some .     
31190 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
311a0 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20  tion managed to 
311b0 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20  get in and roll 
311c0 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a  it back before .
311d0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
311e0 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
311f0 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
31200 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
31210 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  it .      ** may
31220 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70   mean that the p
31230 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20  ager was in the 
31240 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
31250 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
31260 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
31270 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  ed and the journ
31280 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
31290 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
312a0 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70  .      if( !isOp
312b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
312c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
312d0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
312e0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
312f0 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  fs;.        int 
31300 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20  bExists;        
31310 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
31320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
31330 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ists */.        
31340 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
31350 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
31360 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
31370 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
31380 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
31390 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20  &bExists);.     
313a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
313b0 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20  E_OK && bExists 
313c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
313d0 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
313e0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
313f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
31400 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
31410 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
31420 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
31430 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
31440 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
31450 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
31460 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
31470 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
31480 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
31490 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
314a0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
314b0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
314c0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
314d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
314e0 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
314f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
31500 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
31510 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31520 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
31530 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31540 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
31550 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
31560 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
31570 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
31580 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
31590 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
315a0 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
315b0 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
315c0 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
315d0 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
315e0 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63  ock. Purge the c
315f0 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20  ache before.    
31600 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63    ** playing bac
31610 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  k the hot-journa
31620 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e  l so that we don
31630 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20  't end up with. 
31640 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e       ** an incon
31650 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20  sistent cache.  
31660 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75  Sync the hot jou
31670 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
31680 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  ing.      ** it 
31690 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70  back since the p
316a0 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73  rocess that cras
316b0 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65  hed and left the
316c0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot journal.   
316d0 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64     ** probably d
316e0 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61  id not sync it a
316f0 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72  nd we are requir
31700 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e  ed to always syn
31710 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a  c.      ** the j
31720 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
31730 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20  aying it back.. 
31740 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
31750 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
31760 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
31770 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
31780 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
31790 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63    rc = pagerSync
317a0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
317b0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
317c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
317d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
317e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
317f0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
31800 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
31810 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
31820 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31830 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
31840 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
31850 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  de ){.        pa
31860 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
31870 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
31880 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31890 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
318a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
318b0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
318c0 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f  taken if an erro
318d0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
318e0 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20  rying to open.  
318f0 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c        ** or roll
31900 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
31910 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  nal while holdin
31920 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
31930 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20  ock. The.       
31940 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   ** pager_unlock
31950 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
31960 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
31970 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e   returning to un
31980 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  lock.        ** 
31990 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
319a0 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20   unlock attempt 
319b0 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65  fails, then Page
319c0 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a  r.eLock must be.
319d0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
319e0 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28  o UNKNOWN_LOCK (
319f0 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
31a00 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
31a10 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  e for .        *
31a20 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61  * UNKNOWN_LOCK a
31a30 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c  bove for an expl
31a40 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20  anation). .     
31a50 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31a60 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   In order to get
31a70 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
31a80 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20  to do this, set 
31a90 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a  Pager.eState to.
31aa0 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52          ** PAGER
31ab0 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73  _ERROR now. This
31ac0 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
31ad0 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72   counted as a tr
31ae0 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20  ansition.       
31af0 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61   ** to ERROR sta
31b00 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  te in the state 
31b10 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74  diagram at the t
31b20 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c  op of this file,
31b30 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63  .        ** sinc
31b40 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  e we know that t
31b50 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20  he same call to 
31b60 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
31b70 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20  ill very.       
31b80 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e   ** shortly tran
31b90 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72  sition the pager
31ba0 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f   object to the O
31bb0 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69  PEN state. Calli
31bc0 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ng.        ** as
31bd0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
31be0 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f  () would fail no
31bf0 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20  w, as it should 
31c00 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
31c10 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
31c20 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
31c30 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a  when there are z
31c40 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ero outstanding 
31c50 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  page .        **
31c60 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20   references..   
31c70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31c80 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
31c90 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
31ca0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
31cb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
31cc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
31cd0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
31ce0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31cf0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
31d00 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
31d10 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61           || (pPa
31d20 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
31d30 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  de && pPager->eL
31d40 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
31d50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
31d60 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
31d70 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 28 0a  ->tempFile && (.
31d80 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
31d90 70 42 61 63 6b 75 70 20 0a 20 20 20 20 20 7c 7c  pBackup .     ||
31da0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
31db0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
31dc0 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20  pPCache)>0 .    
31dd0 20 7c 7c 20 55 53 45 46 45 54 43 48 28 70 50 61   || USEFETCH(pPa
31de0 67 65 72 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  ger).    )){.   
31df0 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
31e00 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
31e10 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20  een acquired on 
31e20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31e30 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  e.      ** and t
31e40 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
31e50 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
31e60 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76  che (from a prev
31e70 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65  ious.      ** re
31e80 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
31e90 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b  saction).  Check
31ea0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64   to see if the d
31eb0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
31ec0 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
31ed0 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
31ee0 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64  base has changed
31ef0 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20  , flush the.    
31f00 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20    ** cache..    
31f10 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61    **.      ** Da
31f20 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
31f30 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
31f40 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
31f50 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
31f60 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
31f70 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
31f80 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
31f90 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
31fa0 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
31fb0 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
31fc0 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
31fd0 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
31fe0 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
31ff0 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
32000 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
32010 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
32020 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
32030 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
32040 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
32050 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
32060 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
32070 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
32080 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
32090 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
320a0 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
320b0 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
320c0 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
320d0 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
320e0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
320f0 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
32100 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f     */.      Pgno
32110 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20   nPage = 0;.    
32120 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
32130 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
32140 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a  >dbFileVers)];..
32150 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32160 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
32170 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
32180 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
32190 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66  ailed;..      if
321a0 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
321b0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
321c0 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20  KVERS %p %d\n", 
321d0 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64  pPager, sizeof(d
321e0 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20  bFileVers)));.  
321f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32200 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
32210 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
32220 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
32230 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
32240 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32250 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
32260 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
32270 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
32280 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
32290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
322a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
322b0 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
322c0 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
322d0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
322e0 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
322f0 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
32300 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
32310 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
32320 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
32330 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
32340 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
32350 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64    /* Unmap the d
32360 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
32370 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
32380 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  t external proce
32390 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  sses.        ** 
323a0 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74  may have truncat
323b0 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
323c0 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78  file and then ex
323d0 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20  tended it back. 
323e0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73         ** to its
323f0 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77   original size w
32400 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
32410 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e  s was not holdin
32420 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  g a lock..      
32430 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
32440 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73  e there may exis
32450 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d  t a Pager.pMap m
32460 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65  apping that appe
32470 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ars.        ** t
32480 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73  o be the right s
32490 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61  ize but is not a
324a0 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41  ctually valid. A
324b0 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20  void this.      
324c0 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79    ** possibility
324d0 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68   by unmapping th
324e0 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20  e db here. */.  
324f0 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54        if( USEFET
32500 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  CH(pPager) ){.  
32510 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
32520 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
32530 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
32540 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32550 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
32560 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
32570 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
32580 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
32590 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
325a0 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
325b0 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
325c0 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
325d0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
325e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
325f0 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
32600 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a  resent(pPager);.
32610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32620 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
32630 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
32640 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
32650 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
32660 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
32670 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
32680 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
32690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
326a0 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
326b0 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
326c0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
326d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
326e0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
326f0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
32700 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
32710 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
32720 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53  er, &pPager->dbS
32730 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c  ize);.  }.. fail
32740 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
32750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
32760 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
32770 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
32780 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  k(pPager);.    a
32790 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
327a0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
327b0 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  N );.  }else{.  
327c0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
327d0 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
327e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
327f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
32800 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
32810 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
32820 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
32830 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
32840 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
32850 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
32860 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
32870 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
32880 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
32890 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
328a0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
328b0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
328c0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
328d0 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
328e0 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
328f0 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
32900 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
32910 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
32920 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
32930 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
32940 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
32950 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
32960 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33  t==0 && (sqlite3
32970 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
32980 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
32990 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72  =0) ){.    pager
329a0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
329b0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
329c0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
329d0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
329e0 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  age number pgno 
329f0 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20  in pager pPager 
32a00 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72  (a page.** refer
32a10 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62  ence has type Db
32a20 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72  Page*). If the r
32a30 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
32a40 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
32a50 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
32a60 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
32a70 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
32a80 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
32a90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
32aa0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
32ab0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
32ac0 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
32ad0 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
32ae0 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
32af0 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
32b00 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
32b10 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
32b20 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
32b30 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
32b40 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
32b50 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
32b60 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
32b70 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
32b80 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
32b90 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
32ba0 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
32bb0 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
32bc0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
32bd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
32be0 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
32bf0 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
32c00 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
32c10 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
32c20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
32c30 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
32c40 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
32c50 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
32c60 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
32c70 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
32c80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
32c90 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
32ca0 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
32cb0 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
32cc0 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
32cd0 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
32ce0 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
32cf0 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
32d00 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
32d10 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
32d20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
32d30 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
32d40 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
32d50 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
32d60 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
32d70 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
32d80 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
32d90 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
32da0 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
32db0 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
32dc0 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
32dd0 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
32de0 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
32df0 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
32e00 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
32e10 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
32e20 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
32e30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
32e40 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
32e50 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
32e60 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
32e70 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
32e80 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  two scenarios:.*
32e90 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
32ea0 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
32eb0 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
32ec0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
32ed0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
32ee0 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
32ef0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
32f00 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
32f10 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
32f20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
32f30 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65   the cache to be
32f40 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
32f50 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
32f60 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
32f70 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
32f80 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
32f90 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
32fa0 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
32fb0 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
32fc0 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20  ead of.** being 
32fd0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
32fe0 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
32ff0 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
33000 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
33010 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
33020 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
33030 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
33040 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
33050 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
33060 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
33070 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
33080 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
33090 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
330a0 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
330b0 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
330c0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
330d0 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
330e0 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
330f0 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
33100 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
33110 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
33120 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
33130 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
33140 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
33150 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
33160 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
33170 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
33180 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
33190 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
331a0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
331b0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
331c0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
331d0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
331e0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
331f0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
33200 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
33210 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
33220 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
33230 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
33240 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
33250 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
33260 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
33270 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
33280 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
33290 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
332a0 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
332b0 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
332c0 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
332d0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
332e0 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
332f0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
33300 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
33310 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
33320 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
33330 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
33340 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
33350 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
33360 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
33370 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
33380 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
33390 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
333a0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
333b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
333c0 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
333d0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
333e0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
333f0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
33400 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
33410 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
33420 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
33430 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
33440 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
33450 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
33460 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
33470 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
33480 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
33490 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
334a0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
334b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
334c0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
334d0 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20  0;.  u32 iFrame 
334e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
334f0 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f       /* Frame to
33500 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66   read from WAL f
33510 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ile */.  const i
33520 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  nt noContent = (
33530 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
33540 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20  T_NOCONTENT);.. 
33550 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74   /* It is accept
33560 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65  able to use a re
33570 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70  ad-only (mmap) p
33580 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65  age for any page
33590 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67   except.  ** pag
335a0 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  e 1 if there is 
335b0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
335c0 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65  tion open or the
335d0 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c   ACQUIRE_READONL
335e0 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20  Y.  ** flag was 
335f0 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
33600 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20   caller. And so 
33610 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69  long as the db i
33620 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65  s not a .  ** te
33630 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
33640 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
33650 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62  */.  const int b
33660 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d  MmapOk = (pgno!=
33670 31 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50  1 && USEFETCH(pP
33680 61 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61  ager).   && (pPa
33690 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
336a0 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
336b0 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f  ags & PAGER_GET_
336c0 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65  READONLY)).#ifde
336d0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
336e0 45 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  EC.   && pPager-
336f0 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69  >xCodec==0.#endi
33700 66 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  f.  );..  assert
33710 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33720 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
33730 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
33740 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
33750 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
33760 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  rt( noContent==0
33770 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29   || bMmapOk==0 )
33780 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  ;..  if( pgno==0
33790 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
337a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
337b0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
337c0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
337d0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
337e0 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
337f0 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
33800 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
33810 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
33820 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
33830 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
33840 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
33850 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33860 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
33870 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
33880 7b 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70  {..    if( bMmap
33890 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61  Ok && pagerUseWa
338a0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
338b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
338c0 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
338d0 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20  er->pWal, pgno, 
338e0 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20  &iFrame);.      
338f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33900 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61  K ) goto pager_a
33910 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
33920 7d 0a 0a 20 20 20 20 69 66 28 20 69 46 72 61 6d  }..    if( iFram
33930 65 3d 3d 30 20 26 26 20 62 4d 6d 61 70 4f 6b 20  e==0 && bMmapOk 
33940 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
33950 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Data = 0;..     
33960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
33970 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
33980 20 0a 20 20 20 20 20 20 20 20 20 20 28 69 36 34   .          (i64
33990 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67  )(pgno-1) * pPag
339a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
339b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
339c0 26 70 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a  &pData.      );.
339d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
339e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74  QLITE_OK && pDat
339f0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  a ){.        if(
33a00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
33a10 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a  PAGER_READER ){.
33a20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29            (void)
33a30 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
33a40 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
33a50 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
33a60 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
33a70 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30        if( pPg==0
33a80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
33a90 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 4d   = pagerAcquireM
33aa0 61 70 50 61 67 65 28 70 50 61 67 65 72 2c 20 70  apPage(pPager, p
33ab0 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67  gno, pData, &pPg
33ac0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
33ad0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
33ae0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
33af0 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
33b00 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
33b10 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
33b20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33b30 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
33b40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33b50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
33b60 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61  .          *ppPa
33b70 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ge = pPg;.      
33b80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33b90 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
33ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33bb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33bc0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
33bd0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
33be0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
33bf0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
33c00 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
33c10 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
33c20 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b  gno, 1, ppPage);
33c30 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
33c40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33c50 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
33c60 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
33c70 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
33c80 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
33c90 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
33ca0 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
33cb0 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
33cc0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
33cd0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
33ce0 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
33cf0 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
33d00 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
33d10 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
33d20 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
33d30 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
33d40 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
33d50 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
33d60 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
33d70 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
33d80 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
33d90 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  | (*ppPage)->pPa
33da0 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
33db0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
33dc0 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
33dd0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
33de0 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
33df0 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
33e00 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
33e10 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
33e20 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
33e30 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
33e40 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
33e50 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
33e60 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
33e70 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
33e80 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
33e90 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
33ea0 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d  [PAGER_STAT_HIT]
33eb0 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ++;.    return S
33ec0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
33ed0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
33ee0 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
33ef0 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
33f00 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
33f10 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
33f20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
33f30 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a   */..    pPg = *
33f40 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d  ppPage;.    pPg-
33f50 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
33f60 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
33f70 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
33f80 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
33f90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
33fa0 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
33fb0 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
33fc0 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
33fd0 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
33fe0 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
33ff0 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
34000 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
34010 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
34020 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
34030 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
34040 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
34050 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
34060 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34070 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
34080 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61  if( MEMDB || pPa
34090 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f  ger->dbSize<pgno
340a0 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c   || noContent ||
340b0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
340c0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  >fd) ){.      if
340d0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
340e0 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
340f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
34100 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
34110 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34120 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
34130 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
34140 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
34150 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
34160 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
34170 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
34180 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
34190 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
341a0 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
341b0 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
341c0 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
341d0 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
341e0 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
341f0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
34200 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
34210 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
34220 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
34230 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
34240 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
34250 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
34260 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
34270 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
34280 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
34290 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
342a0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
342b0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
342c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
342d0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
342e0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
342f0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
34300 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
34310 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
34320 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
34330 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
34340 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
34350 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34360 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
34370 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
34380 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
34390 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
343a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
343b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
343c0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
343d0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
343e0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
343f0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
34400 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
34410 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
34420 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
34430 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
34440 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
34450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
34460 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
34470 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f  Pager) && bMmapO
34480 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
34490 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
344a0 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
344b0 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
344c0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  rame);.        i
344d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
344e0 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
344f0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34500 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
34510 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
34520 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
34530 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
34540 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
34550 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
34560 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d  bPage(pPg, iFram
34570 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
34580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34590 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
345a0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
345b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
345c0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
345d0 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ash(pPg);.  }.. 
345e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
345f0 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72  K;..pager_acquir
34600 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28  e_err:.  assert(
34610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34620 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
34630 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
34640 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Drop(pPg);.  }. 
34650 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
34660 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20  used(pPager);.. 
34670 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
34680 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34690 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
346a0 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
346b0 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
346c0 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
346d0 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
346e0 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
346f0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
34700 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
34710 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
34720 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
34730 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  he. .**.** See a
34740 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
34750 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
34760 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
34770 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
34780 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
34790 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
347a0 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
347b0 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
347c0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
347d0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
347e0 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
347f0 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
34800 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
34810 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
34820 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
34830 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
34840 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
34850 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
34860 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
34870 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
34880 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
34890 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
348a0 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  Pg = 0;.  assert
348b0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
348c0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
348d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
348e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30  ager->pPCache!=0
348f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34900 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
34910 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50  GER_READER && pP
34920 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
34930 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73  GER_ERROR );.  s
34940 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34950 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
34960 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67  e, pgno, 0, &pPg
34970 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  );.  return pPg;
34980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
34990 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e  e a page referen
349a0 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ce..**.** If the
349b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
349c0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
349d0 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
349e0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
349f0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
34a00 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
34a10 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
34a20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
34a30 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
34a40 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
34a50 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
34a60 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
34a70 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76  ** removed..*/.v
34a80 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
34a90 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
34aa0 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g){.  if( pPg ){
34ab0 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
34ac0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
34ad0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66  ;.    if( pPg->f
34ae0 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41  lags & PGHDR_MMA
34af0 50 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  P ){.      pager
34b00 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70  ReleaseMapPage(p
34b10 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
34b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
34b30 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
34b40 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
34b50 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
34b60 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
34b70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
34b80 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
34b90 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
34ba0 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
34bb0 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
34bc0 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
34bd0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
34be0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
34bf0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
34c00 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
34c10 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
34c20 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
34c30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
34c40 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
34c50 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
34c60 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
34c70 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
34c80 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
34c90 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
34ca0 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
34cb0 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
34cc0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
34cd0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
34ce0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
34cf0 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
34d00 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
34d10 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
34d20 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
34d30 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
34d40 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
34d50 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
34d60 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
34d70 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
34d80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34d90 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
34da0 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
34db0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
34dc0 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
34dd0 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
34de0 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
34df0 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
34e00 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
34e10 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
34e20 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
34e30 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
34e40 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
34e50 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
34e60 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
34e70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
34e80 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
34e90 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
34ea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
34eb0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
34ec0 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
34ed0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
34ee0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
34ef0 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
34f00 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
34f10 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
34f20 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
34f30 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
34f40 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
34f50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34f60 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
34f70 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
34f80 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
34f90 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
34fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
34fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fc0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
34fd0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
34fe0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
34ff0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
35000 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
35010 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
35020 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
35030 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35040 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
35050 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
35060 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
35070 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
35080 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35090 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
350a0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
350b0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
350c0 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
350d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
350e0 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
350f0 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
35100 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
35110 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
35120 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
35130 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
35140 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
35150 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
35160 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
35170 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
35180 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  e;..  if( !pager
35190 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
351a0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
351b0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
351c0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
351d0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
351e0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
351f0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
35200 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
35210 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
35220 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
35230 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35240 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
35250 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74    .    /* Open t
35260 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35270 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
35280 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
35290 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
352a0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
352b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
352c0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
352d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
352e0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  EMORY ){.       
352f0 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
35300 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
35310 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fd);.      }else
35320 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
35330 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20  int flags =     
35340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35350 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70   VFS flags to op
35360 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
35370 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  */.          SQL
35380 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
35390 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
353a0 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
353b0 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   (pPager->tempFi
353c0 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  le ? .          
353d0 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44    (SQLITE_OPEN_D
353e0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
353f0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
35400 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20  URNAL):.        
35410 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
35420 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
35430 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 69           );.  #i
35440 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
35450 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
35460 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35470 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
35480 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66  .            pVf
35490 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
354a0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
354b0 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
354c0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
354d0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 65 6c          );.  #el
354e0 73 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  se.        rc = 
354f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
35500 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
35510 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
35520 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  d, flags, 0);.  
35530 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
35540 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
35550 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
35560 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
35570 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ) );.    }.  .  
35580 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
35590 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
355a0 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f  header to the jo
355b0 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f  urnal file and o
355c0 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  pen .    ** the 
355d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
355e0 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
355f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35610 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
35620 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
35630 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
35640 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61  ed. */.      pPa
35650 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
35660 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
35670 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
35680 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
35690 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
356a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
356b0 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  dr = 0;.      rc
356c0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
356d0 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
356e0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
356f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35700 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
35710 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
35720 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
35730 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35740 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  al = 0;.  }else{
35750 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
35760 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
35770 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
35780 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
35790 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
357a0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a  RITER_CACHEMOD;.
357b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
357c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
357d0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
357e0 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63  tion on the spec
357f0 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65  ified pager obje
35800 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69  ct. If a .** wri
35810 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
35820 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
35830 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  opened, this fun
35840 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
35850 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
35860 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  xFlag argument i
35870 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63  s false, then ac
35880 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61  quire at least a
35890 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
358a0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
358b0 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61  e file. If exFla
358c0 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
358d0 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
358e0 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45  .** an EXCLUSIVE
358f0 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61   lock. If such a
35900 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
35910 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e   held, no lockin
35920 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  g .** functions 
35930 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a  need be called..
35940 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
35950 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
35960 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
35970 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
35980 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
35990 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
359a0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
359b0 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
359c0 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
359d0 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
359e0 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
359f0 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
35a00 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
35a10 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
35a20 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
35a30 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
35a40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
35a50 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
35a60 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
35a70 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
35a80 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
35a90 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
35aa0 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
35ab0 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
35ac0 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
35ad0 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
35ae0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
35af0 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
35b00 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
35b10 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
35b20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
35b30 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
35b40 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
35b50 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
35b60 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
35b70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
35b80 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
35b90 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
35ba0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73  r->errCode;.  as
35bb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35bc0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
35bd0 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
35be0 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52  tate<PAGER_ERROR
35bf0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
35c00 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
35c10 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
35c20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
35c30 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
35c40 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20  ER_READER) ){.  
35c50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35c60 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
35c70 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
35c80 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
35c90 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
35ca0 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66  he pager is conf
35cb0 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f  igured to use lo
35cc0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
35cd0 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20  sive, and an.   
35ce0 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20     ** exclusive 
35cf0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
35d00 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  base is not alre
35d10 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e  ady held, obtain
35d20 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a   it now..      *
35d30 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
35d40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
35d50 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
35d60 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
35d70 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29  ger->pWal, -1) )
35d80 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
35d90 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
35da0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
35db0 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
35dc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35dd0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
35de0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
35df0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
35e00 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
35e10 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29  pPager->pWal, 1)
35e20 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
35e30 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69   /* Grab the wri
35e40 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c  te lock on the l
35e50 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
35e60 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20  essful, upgrade 
35e70 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  to.      ** PAGE
35e80 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
35e90 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
35ea0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
35eb0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
35ec0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75  .      ** The bu
35ed0 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f  sy-handler is no
35ee0 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f  t invoked if ano
35ef0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
35f00 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
35f10 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65   holds the write
35f20 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62  -lock. If possib
35f30 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  le, the upper la
35f40 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74  yer will call it
35f50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35f60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
35f70 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61  BeginWriteTransa
35f80 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
35f90 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
35fa0 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
35fb0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
35fc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35fd0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
35fe0 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
35ff0 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
36000 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
36010 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
36020 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
36030 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ck. The.      **
36040 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
36050 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
36060 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
36070 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
36080 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  VE.      ** lock
36090 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
360a0 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
360b0 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
360c0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
360d0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
360e0 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
360f0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
36100 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
36110 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
36120 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
36130 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
36140 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
36150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36160 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
36170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36180 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49  /* Change to WRI
36190 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
361a0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
361b0 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74   ** WAL mode set
361c0 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  s Pager.eState t
361d0 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  o PAGER_WRITER_L
361e0 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f  OCKED or CACHEMO
361f0 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  D.      ** when 
36200 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74  it has an open t
36210 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
36220 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f  never to DBMOD o
36230 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20  r FINISHED..    
36240 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
36250 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74  ause in those st
36260 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
36270 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70   roll back savep
36280 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
36290 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20  ransactions may 
362a0 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
362b0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
362c0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
362d0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
362e0 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20  as well as into 
362f0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
36300 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
36310 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20  ncorrect in .   
36320 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a     ** WAL mode..
36330 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
36340 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
36350 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
36360 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65  KED;.      pPage
36370 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
36380 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
36390 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
363a0 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  FileSize = pPage
363b0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
363c0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
363d0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
363e0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
363f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
36400 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   0;.    }..    a
36410 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
36420 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
36430 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
36440 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65  ADER );.    asse
36450 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
36460 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
36470 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
36480 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
36490 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
364a0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
364b0 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  r) );.  }..  PAG
364c0 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
364d0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
364e0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
364f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36500 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
36510 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
36520 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
36530 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
36540 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
36550 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
36560 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
36570 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
36580 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
36590 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
365a0 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
365b0 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
365c0 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
365d0 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
365e0 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
365f0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
36600 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
36610 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
36620 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
36630 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
36640 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
36650 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
36660 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
36670 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
36680 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
36690 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
366a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
366b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68  ITE_OK;..  /* Th
366c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
366d0 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20  t called unless 
366e0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
366f0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
36700 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74  .  ** been start
36710 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  ed. The journal 
36720 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
36730 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74  not be open at t
36740 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
36750 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  It is never call
36760 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  ed in the ERROR 
36770 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  state..  */.  as
36780 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
36790 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
367a0 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
367b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
367c0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
367d0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
367e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
367f0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
36800 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
36810 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
36820 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
36830 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   );..  /* If an 
36840 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
36850 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74  reviously detect
36860 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73  ed, report the s
36870 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61  ame error.  ** a
36880 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c  gain. This shoul
36890 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75  d not happen, bu
368a0 74 20 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76  t the check prov
368b0 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e  ides robustness.
368c0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
368d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
368e0 20 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65   )  return pPage
368f0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f  r->errCode;..  /
36900 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72  * Higher-level r
36910 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61  outines never ca
36920 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
36930 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20   if database is 
36940 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c  not.  ** writabl
36950 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e  e.  But check an
36960 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72  yway, just for r
36970 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20  obustness. */.  
36980 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
36990 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65  ->readOnly) ) re
369a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
369b0 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
369c0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  pPg);..  /* The 
369d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65  journal file nee
369e0 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e  ds to be opened.
369f0 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f   Higher level ro
36a00 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65  utines have alre
36a10 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65  ady.  ** obtaine
36a20 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
36a30 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74  locks to begin t
36a40 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
36a50 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20  tion, but the.  
36a60 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
36a70 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65  nal might not ye
36a80 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20  t be open. Open 
36a90 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69  it now if this i
36aa0 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a  s the case..  **
36ab0 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f  .  ** This is do
36ac0 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ne before callin
36ad0 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  g sqlite3PcacheM
36ae0 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68  akeDirty() on th
36af0 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74  e page. .  ** Ot
36b00 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20 77  herwise, if it w
36b10 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63  ere done after c
36b20 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63  alling sqlite3Pc
36b30 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c  acheMakeDirty(),
36b40 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72   then.  ** an er
36b50 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20  ror might occur 
36b60 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f  and the pager wo
36b70 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52  uld end up in WR
36b80 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
36b90 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65  e.  ** with page
36ba0 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
36bb0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  y in the cache..
36bc0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
36bd0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36be0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
36bf0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
36c00 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
36c10 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
36c20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
36c30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
36c40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36c50 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
36c60 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
36c70 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
36c80 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
36c90 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ager) );..  /* M
36ca0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
36cb0 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
36cc0 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
36cd0 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
36ce0 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
36cf0 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
36d00 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
36d10 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
36d20 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
36d30 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  g);.  if( pageIn
36d40 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
36d50 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
36d60 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73  e(pPg) ){.    as
36d70 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
36d80 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
36d90 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a  }else{.  .    /*
36da0 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
36db0 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
36dc0 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
36dd0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
36de0 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
36df0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
36e00 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
36e10 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
36e20 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
36e30 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
36e40 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
36e50 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
36e60 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
36e70 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f     if( !pageInJo
36e80 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 70  urnal(pPg) && !p
36e90 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
36ea0 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  r) ){.      asse
36eb0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
36ec0 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
36ed0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
36ee0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
36ef0 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28  gSize && isOpen(
36f00 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
36f10 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
36f20 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  m;.        char 
36f30 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20  *pData2;.       
36f40 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67   i64 iOff = pPag
36f50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
36f60 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
36f70 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
36f80 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
36f90 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
36fa0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
36fb0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
36fc0 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
36fd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
36fe0 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
36ff0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
37000 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
37010 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
37020 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
37030 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  O(pPager) );..  
37040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
37050 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
37060 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
37070 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20  lOff );.        
37080 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
37090 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
370a0 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
370b0 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
370c0 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
370d0 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
370e0 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
370f0 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  2);..        /* 
37100 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
37110 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
37120 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75  occurs while jou
37130 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20  rnalling the.   
37140 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
37150 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c  the block above,
37160 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79   set the need-sy
37170 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20  nc flag for the 
37180 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  page..        **
37190 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e   Otherwise, when
371a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
371b0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
371c0 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20   the logic in.  
371d0 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63        ** playbac
371e0 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c  k_one_page() wil
371f0 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65  l think that the
37200 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
37210 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20  e restored.     
37220 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74     ** in the dat
37230 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
37240 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
37250 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
37260 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a  g so,.        **
37270 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
37280 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20   may follow..   
37290 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
372a0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
372b0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a  HDR_NEED_SYNC;..
372c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
372d0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
372e0 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d  >jfd, iOff, pPg-
372f0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
37300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37310 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
37320 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
37330 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
37340 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
37350 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
37360 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20  , iOff+4);.     
37370 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37380 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
37390 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
373a0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
373b0 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61  r->jfd, iOff+pPa
373c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
373d0 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
373e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
373f0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37400 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
37410 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
37420 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
37430 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
37440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
37450 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37460 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
37470 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50  ize));.        P
37480 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
37490 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
374a0 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50  ount);.        P
374b0 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
374c0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
374d0 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
374e0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
374f0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
37500 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
37510 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
37520 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
37530 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
37540 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
37550 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20  ash(pPg)));..   
37560 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
37570 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70  rnalOff += 8 + p
37580 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
37590 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
375a0 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
375b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
375c0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
375d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
375e0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
375f0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37600 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
37610 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
37620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
37630 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EM );.        as
37640 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
37650 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
37660 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
37670 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61     rc |= addToSa
37680 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
37690 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
376a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
376b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
376c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
376d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
376e0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EM );.          
376f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
37700 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
37710 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
37720 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
37730 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
37740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
37750 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
37760 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
37770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
37780 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45  AGERTRACE(("APPE
37790 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
377a0 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
377b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
377c0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
377d0 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  Pg->pgno,.      
377e0 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
377f0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
37800 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20  _SYNC)?1:0)));. 
37810 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
37820 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
37830 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
37840 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
37850 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
37860 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
37870 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
37880 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
37890 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
378a0 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
378b0 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
378c0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
378d0 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
378e0 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
378f0 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
37900 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
37910 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
37920 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
37930 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62    */.    if( sub
37940 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
37950 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  g) ){.      rc =
37960 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
37970 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
37980 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
37990 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
379a0 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
379b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
379c0 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
379d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
379e0 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
379f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37a00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
37a10 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
37a20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20  writeable. This 
37a30 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
37a40 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a  called before .*
37a50 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  * making changes
37a60 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20   to a page. The 
37a70 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63  caller must chec
37a80 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  k the return val
37a90 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66  ue .** of this f
37aa0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63  unction and be c
37ab0 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68  areful not to ch
37ac0 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
37ad0 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68  ta unless .** th
37ae0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
37af0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
37b00 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
37b10 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
37b20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
37b30 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
37b40 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
37b50 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
37b60 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
37b70 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
37b80 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
37b90 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
37ba0 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
37bb0 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
37bc0 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
37bd0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
37be0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
37bf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
37c00 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
37c10 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
37c20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e  occurs, SQLITE_N
37c30 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72  OMEM or an IO er
37c40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
37c50 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f  rned.** as appro
37c60 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73  priate. Otherwis
37c70 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
37c80 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
37c90 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
37ca0 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
37cb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
37cc0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
37cd0 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
37ce0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
37cf0 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
37d00 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
37d10 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
37d20 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
37d30 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ize);..  assert(
37d40 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50   (pPg->flags & P
37d50 47 48 44 52 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b  GHDR_MMAP)==0 );
37d60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37d70 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
37d80 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
37d90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37da0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
37db0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
37dc0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
37dd0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
37de0 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
37df0 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
37e00 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
37e10 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
37e20 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
37e30 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
37e40 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
37e50 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
37e60 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
37e70 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
37e80 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
37e90 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
37ea0 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20   nPage = 0;     
37eb0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
37ec0 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
37ed0 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
37ee0 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
37ef0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
37f00 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
37f10 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
37f20 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
37f30 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
37f40 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
37f50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
37f60 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  /..    /* Set th
37f70 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53  e doNotSpill NOS
37f80 59 4e 43 20 62 69 74 20 74 6f 20 31 2e 20 54 68  YNC bit to 1. Th
37f90 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
37fa0 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20   cannot allow.  
37fb0 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68    ** a journal h
37fc0 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
37fd0 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
37fe0 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
37ff0 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  by.    ** this f
38000 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
38010 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
38020 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
38030 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  ( (pPager->doNot
38040 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
38050 47 5f 4e 4f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  G_NOSYNC)==0 );.
38060 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
38070 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46  tSpill |= SPILLF
38080 4c 41 47 5f 4e 4f 53 59 4e 43 3b 0a 0a 20 20 20  LAG_NOSYNC;..   
38090 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
380a0 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
380b0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
380c0 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
380d0 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
380e0 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
380f0 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
38100 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
38110 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
38120 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
38130 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
38140 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
38150 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
38160 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
38170 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
38180 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
38190 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20     nPageCount = 
381a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
381b0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
381c0 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  o>nPageCount ){.
381d0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
381e0 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
381f0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
38200 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
38210 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
38220 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
38230 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
38240 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -pg1;.    }else{
38250 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
38260 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20  PagePerSector;. 
38270 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
38280 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73  nPage>0);.    as
38290 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70  sert(pg1<=pPg->p
382a0 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
382b0 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
382c0 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f  ->pgno);..    fo
382d0 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
382e0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
382f0 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  K; ii++){.      
38300 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69  Pgno pg = pg1+ii
38310 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  ;.      PgHdr *p
38320 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Page;.      if( 
38330 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
38340 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
38350 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
38360 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20  ournal, pg) ){. 
38370 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
38380 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
38390 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
383a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
383b0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
383c0 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
383d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
383e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
383f0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
38400 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
38410 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
38420 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
38430 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
38440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
38450 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
38460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38470 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
38480 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
38490 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
384a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
384b0 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70  e if( (pPage = p
384c0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
384d0 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20  er, pg))!=0 ){. 
384e0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
384f0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
38500 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
38510 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
38520 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
38530 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
38540 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
38550 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
38560 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44    /* If the PGHD
38570 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
38580 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20   is set for any 
38590 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67  of the nPage pag
385a0 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  es .    ** start
385b0 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e  ing at pg1, then
385c0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
385d0 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  set for all of t
385e0 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20  hem. Because.   
385f0 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61   ** writing to a
38600 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67  ny of these nPag
38610 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61  e pages may dama
38620 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74  ge the others, t
38630 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
38640 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74  l file must cont
38650 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70  ain sync()ed cop
38660 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68  ies of all of th
38670 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  em.    ** before
38680 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e   any of them can
38690 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
386a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
386b0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
386c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
386d0 4f 4b 20 26 26 20 6e 65 65 64 53 79 6