/ Hex Artifact Content
Login

Artifact 3436cc9cce915e3fbcf9ae26a877816c2e6158f1:


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 20 3d 20  ;.  Pgno pgno = 
b1c0: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74  pPg->pgno;.  int
b1d0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b1e0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
b1f0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  int; i++){.    p
b200: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
b210: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
b220: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
b230: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
b240: 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e  itvecTest(p->pIn
b250: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
b260: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b270: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
b280: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
b290: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
b2a0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
b2b0: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
b2c0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rnal file..*/.st
b2d0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a  atic int pageInJ
b2e0: 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
b2f0: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
b300: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
b310: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Pg->pPager->pInJ
b320: 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
b330: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  o);.}../*.** Rea
b340: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
b350: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
b360: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
b370: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
b380: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
b390: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
b3a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b3b0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
b3c0: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
b3d0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
b3e0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
b3f0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
b400: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
b410: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
b420: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
b430: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
b440: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b450: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b460: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
b470: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
b480: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
b490: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
b4a0: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
b4b0: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
b4c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b4d0: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
b4e0: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
b4f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
b510: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b520: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
b530: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
b540: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
b550: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
b560: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
b570: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
b580: 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  A,B).../*.** Wri
b590: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
b5a0: 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ger into the giv
b5b0: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
b5c0: 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  or.  Return SQLI
b5d0: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
b5e0: 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
b5f0: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
b600: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
b610: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
b620: 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  e32bits(sqlite3_
b630: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
b640: 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a  fset, u32 val){.
b650: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
b660: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
b670: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
b680: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
b690: 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a  ac, 4, offset);.
b6a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
b6b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b6c0: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
b6d0: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
b6e0: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a  either NO_LOCK.*
b6f0: 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  * or SHARED_LOCK
b700: 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
b710: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b720: 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f  he call to xUnlo
b730: 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73  ck().** succeeds
b740: 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
b750: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b760: 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74  o match the (att
b770: 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b  empted) new lock
b780: 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
b790: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b7a0: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b7b0: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b7c0: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63  function is.** c
b7d0: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
b7e0: 64 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65  dify it. See the
b7f0: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b800: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a  he #define of .*
b810: 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  * UNKNOWN_LOCK f
b820: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
b830: 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  n of this..*/.st
b840: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
b850: 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  lockDb(Pager *pP
b860: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
b870: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b880: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
b890: 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  t( !pPager->excl
b8a0: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
b8b0: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63  ger->eLock==eLoc
b8c0: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  k );.  assert( e
b8d0: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
b8e0: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
b8f0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
b900: 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20   eLock!=NO_LOCK 
b910: 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
b920: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69  Pager)==0 );.  i
b930: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
b940: 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
b950: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
b960: 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck>=eLock );.   
b970: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55   rc = sqlite3OsU
b980: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
b990: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , eLock);.    if
b9a0: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21  ( pPager->eLock!
b9b0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
b9c0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b9d0: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b9e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
b9f0: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20  ACE(("UNLOCK %p 
ba00: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65  %d\n", pPager, e
ba10: 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74  Lock)).  }.  ret
ba20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ba30: 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   Lock the databa
ba40: 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c  se file to level
ba50: 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75   eLock, which mu
ba60: 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41  st be either SHA
ba70: 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53  RED_LOCK,.** RES
ba80: 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58  ERVED_LOCK or EX
ba90: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66  CLUSIVE_LOCK. If
baa0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73   the caller is s
bab0: 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
bac0: 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  he.** Pager.eLoc
bad0: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68  k variable to th
bae0: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
baf0: 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ate. .**.** Exce
bb00: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
bb10: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
bb20: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
bb30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
bb40: 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e  .** called, do n
bb50: 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c  ot modify it unl
bb60: 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b  ess the new lock
bb70: 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43  ing state is EXC
bb80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a  LUSIVE_LOCK. .**
bb90: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
bba0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
bbb0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
bbc0: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
bbd0: 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69  ation .** of thi
bbe0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
bbf0: 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67   pagerLockDb(Pag
bc00: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
bc10: 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
bc20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
bc30: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
bc40: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SHARED_LOCK || e
bc50: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
bc60: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58  OCK || eLock==EX
bc70: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
bc80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
bc90: 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61  ock<eLock || pPa
bca0: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
bcb0: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
bcc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
bcd0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65  ck(pPager->fd, e
bce0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Lock);.    if( r
bcf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
bd00: 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d  (pPager->eLock!=
bd10: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c  UNKNOWN_LOCK||eL
bd20: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
bd30: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50  OCK) ){.      pP
bd40: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
bd50: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49  8)eLock;.      I
bd60: 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
bd70: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
bd80: 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20  eLock)).    }.  
bd90: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
bda0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
bdb0: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
bdc0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
bdd0: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
bde0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
bdf0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
be00: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
be10: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
be20: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
be30: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
be40: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
be50: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
be60: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
be70: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
be80: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
be90: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
bea0: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
beb0: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
bec0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
bed0: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
bee0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
bef0: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
bf00: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
bf10: 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  ** The optimizat
bf20: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61  ion is also alwa
bf30: 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  ys enabled for t
bf40: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
bf50: 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  It is.** an erro
bf60: 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  r to call this f
bf70: 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65  unction if pPage
bf80: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r is opened on a
bf90: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
bfa0: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
bfb0: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
bfc0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
bfd0: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
bfe0: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
bff0: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
c000: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c010: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
c020: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c030: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
c040: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
c050: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
c060: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
c070: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c080: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
c090: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
c0a0: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
c0b0: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
c0c0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
c0d0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
c0e0: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63  le ){.    int dc
c0f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c110: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
c120: 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74  stics */.    int
c130: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nSector;       
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c150: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
c160: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  .    int szPage;
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
c190: 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ize */..    asse
c1a0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
c1b0: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63  r->fd) );.    dc
c1c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
c1d0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
c1e0: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
c1f0: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61     nSector = pPa
c200: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
c210: 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50  .    szPage = pP
c220: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
c230: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
c240: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
c250: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
c260: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
c270: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
c280: 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
c290: 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53     if( 0==(dc&(S
c2a0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
c2b0: 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20  IC|(szPage>>8)) 
c2c0: 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67  || nSector>szPag
c2d0: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
c2e0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
c2f0: 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41  .  return JOURNA
c300: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c310: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
c320: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64  (pPager);.}.#end
c330: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  if../*.** If SQL
c340: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c350: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
c360: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
c370: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
c380: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
c390: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
c3a0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
c3b0: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
c3c0: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
c3d0: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
c3e0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c3f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
c400: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
c410: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
c420: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
c430: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
c440: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
c450: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
c460: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
c470: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
c480: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
c490: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
c4a0: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
c4b0: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
c4c0: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
c4d0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c4e0: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
c4f0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
c500: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
c510: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
c520: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
c530: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
c540: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
c550: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
c560: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
c570: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
c580: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
c590: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c5a0: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
c5b0: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
c5c0: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
c5d0: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
c5e0: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
c5f0: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
c600: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
c610: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
c620: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
c630: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
c640: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
c650: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
c660: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
c670: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
c680: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
c690: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
c6a0: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
c6b0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
c6c0: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
c6d0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
c6e0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
c6f0: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
c700: 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
c710: 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
c720: 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
c730: 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
c740: 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68  || pPg->pageHash
c750: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
c760: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
c770: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
c780: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
c790: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
c7a0: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
c7b0: 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f  efine pager_set_
c7c0: 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65 66  pagehash(X).#def
c7d0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
c7e0: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
c7f0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c800: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
c810: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
c820: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c830: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
c840: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
c850: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
c860: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
c870: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c880: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
c890: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
c8a0: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
c8b0: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
c8c0: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
c8d0: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
c8e0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
c8f0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
c900: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
c910: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
c920: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
c930: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
c940: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c950: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
c960: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
c970: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
c980: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
c990: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
c9a0: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
c9b0: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
c9c0: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
c9d0: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
c9e0: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
c9f0: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
ca00: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
ca10: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
ca20: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ca30: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
ca40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
ca50: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
ca60: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
ca70: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
ca80: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
ca90: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
caa0: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
cab0: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
cac0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
cad0: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
cae0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
caf0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
cb00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cb10: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
cb20: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
cb30: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
cb40: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
cb50: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
cb60: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
cb70: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
cb80: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
cb90: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
cba0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
cbb0: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
cbc0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
cbd0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
cbe0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
cbf0: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
cc00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cc10: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
cc20: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
cc30: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
cc40: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
cc50: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
cc60: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
cc70: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
cc80: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
cc90: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
cca0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
ccb0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
ccc0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
ccd0: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
cce0: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
ccf0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
cd00: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
cd10: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
cd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
cd30: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
cd40: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
cd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
cd60: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
cd70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cd80: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
cdb0: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
cdc0: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
cdd0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdf0: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
ce00: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
ce10: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
ce20: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
ce30: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
ce40: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
ce50: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
ce60: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
ce70: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
ce80: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
ce90: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
cea0: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
ceb0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
cec0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
ced0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
cee0: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
cef0: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
cf00: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
cf10: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cf20: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
cf30: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
cf40: 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c   || len==0 .   |
cf50: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cf60: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
cf70: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
cf80: 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  sum)).   || SQLI
cf90: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cfa0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
cfb0: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
cfc0: 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d  -8)).   || memcm
cfd0: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
cfe0: 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c  alMagic, 8).   |
cff0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d000: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
d010: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
d020: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
d030: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
d040: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
d050: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
d060: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
d070: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d080: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d  name */.  for(u=
d090: 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a  0; u<len; u++){.
d0a0: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
d0b0: 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69  ster[u];.  }.  i
d0c0: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
d0d0: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
d0e0: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
d0f0: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
d100: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
d110: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
d120: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
d130: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d140: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
d150: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
d160: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
d170: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
d180: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
d190: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
d1a0: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
d1b0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
d1c0: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
d1d0: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a     len = 0;.  }.
d1e0: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
d1f0: 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74   '\0';.   .  ret
d200: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d210: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d220: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
d230: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
d240: 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65   at or immediate
d250: 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ly .** following
d260: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50   the value in pP
d270: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d280: 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63  , assuming a sec
d290: 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  tor .** size of 
d2a0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
d2b0: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
d2c0: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
d2d0: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
d2e0: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72  .**   Pager.jour
d2f0: 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20  nalOff          
d300: 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  Return value.** 
d310: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
d320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20           0.**   
d360: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
d370: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
d380: 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20     100          
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
d3a0: 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20  .**   2000      
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3c0: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
d3d0: 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  ic i64 journalHd
d3e0: 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70  rOffset(Pager *p
d3f0: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
d400: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
d410: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
d420: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
d430: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
d440: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
d450: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
d460: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
d470: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
d480: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d490: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
d4a0: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
d4b0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
d4c0: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
d4d0: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
d4e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d4f0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66  ) );.  return of
d500: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
d510: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d520: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
d530: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
d540: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
d550: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d560: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
d570: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
d580: 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74  s not been writt
d590: 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20  en to.** within 
d5a0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
d5b0: 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66  saction (i.e. if
d5c0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
d5d0: 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f==0)..**.** If 
d5e0: 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f  doTruncate is no
d5f0: 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61  n-zero or the Pa
d600: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d610: 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73  imit variable is
d620: 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68  .** set to 0, th
d630: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  en truncate the 
d640: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d650: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
d660: 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ze. Otherwise,.*
d670: 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79  * zero the 28-by
d680: 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65  te header at the
d690: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
d6a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65  urnal file. In e
d6b0: 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20  ither case, .** 
d6c0: 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
d6d0: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
d6e0: 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
d6f0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64  urnal file immed
d700: 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72  iately .** after
d710: 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e   writing or trun
d720: 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  cating it..**.**
d730: 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   If Pager.journa
d740: 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65  lSizeLimit is se
d750: 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c  t to a positive,
d760: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
d770: 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   and.** followin
d780: 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  g the truncation
d790: 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63   or zeroing desc
d7a0: 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20  ribed above the 
d7b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
d7c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
d7d0: 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20  bytes is larger 
d7e0: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
d7f0: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
d800: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
d810: 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72  le to Pager.jour
d820: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74  nalSizeLimit byt
d830: 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  es. The journal 
d840: 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
d850: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63   need to be sync
d860: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ed following thi
d870: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
d880: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
d890: 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f  r occurs, abando
d8a0: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
d8b0: 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65   return the IO e
d8c0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74  rror code..** Ot
d8d0: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
d8e0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
d8f0: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
d900: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
d910: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
d920: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
d930: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d960: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d970: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
d980: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
d990: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
d9a0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
d9b0: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
d9c0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d9d0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
d9e0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
d9f0: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
da00: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
da10: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
da20: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
da30: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
da40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
da50: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
da60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
da70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
da80: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
da90: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
daa0: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
dab0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
dac0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
dad0: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
dae0: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
daf0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
db00: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
db10: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
db20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
db30: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
db40: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
db50: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
db60: 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
db70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
db80: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
db90: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
dba0: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
dbb0: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
dbc0: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
dbd0: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
dbe0: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
dbf0: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
dc00: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
dc10: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
dc20: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
dc30: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
dc40: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
dc50: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
dc60: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
dc70: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
dc80: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
dc90: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
dca0: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
dcb0: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
dcc0: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
dcd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
dce0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
dcf0: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
dd00: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
dd10: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
dd20: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
dd30: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
dd40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
dd50: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
dd60: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
dd70: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
dd80: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
dd90: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
dda0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
ddb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
ddc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
ddd0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
dde0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ddf0: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
de00: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
de10: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
de20: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
de30: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
de40: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
de50: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
de60: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
de70: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
de80: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
de90: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
dea0: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
deb0: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
dec0: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
ded0: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
dee0: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
def0: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
df00: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
df10: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
df20: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
df30: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
df40: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
df50: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
df60: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
df70: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
df80: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
df90: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
dfa0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
dfb0: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
dfc0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
dfd0: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
dfe0: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
dff0: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
e000: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
e010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
e020: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
e030: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e040: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e050: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
e060: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e070: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
e080: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
e090: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
e0a0: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
e0b0: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
e0c0: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
e0d0: 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67  ader = (u32)pPag
e0e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20  er->pageSize;/* 
e0f0: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
e100: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
e110: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
e120: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e140: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
e150: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
e160: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e190: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
e1a0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e1b0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
e1c0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
e1d0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
e1e0: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
e1f0: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
e200: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
e210: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   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 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
e240: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
e250: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
e260: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
e270: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
e280: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
e290: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
e2a0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
e2b0: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
e2c0: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
e2d0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
e2e0: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
e2f0: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
e300: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
e310: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
e320: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e330: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e340: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
e350: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e360: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
e370: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e380: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
e390: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
e3a0: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
e3b0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
e3c0: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
e3d0: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ger);..  /* .  *
e3e0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
e3f0: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
e400: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
e410: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
e420: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
e430: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
e440: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
e450: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
e460: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
e470: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
e480: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
e490: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e4a0: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
e4b0: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
e4c0: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
e4d0: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
e4e0: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
e4f0: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
e500: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
e510: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
e520: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
e530: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
e540: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
e550: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
e560: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
e570: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
e580: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
e590: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
e5a0: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
e5b0: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
e5c0: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
e5d0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
e5e0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
e5f0: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
e600: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
e610: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
e620: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
e630: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
e640: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
e650: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
e660: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
e670: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
e680: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
e690: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
e6a0: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
e6b0: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
e6c0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
e6d0: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
e6e0: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
e6f0: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
e700: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
e710: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
e720: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
e730: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
e740: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
e750: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
e760: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
e770: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
e780: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
e790: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
e7a0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
e7b0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
e7c0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
e7d0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
e7e0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
e7f0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
e800: 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67  >noSync || (pPag
e810: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
e820: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
e830: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
e840: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
e850: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
e860: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
e870: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
e880: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
e890: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
e8a0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
e8b0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e8c0: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
e8d0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e8e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e8f0: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
e900: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
e910: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
e920: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
e930: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
e940: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
e950: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
e960: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20  itializer */ .  
e970: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
e980: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
e990: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
e9a0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e9b0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
e9c0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e9d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
e9e0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
e9f0: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
ea00: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
ea10: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
ea20: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
ea30: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ea40: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
ea50: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
ea60: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
ea70: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
ea80: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
ea90: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
eaa0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
eab0: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
eac0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
ead0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
eae0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
eaf0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
eb00: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eb10: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
eb20: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
eb30: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
eb40: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
eb50: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
eb60: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
eb70: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
eb80: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
eb90: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
eba0: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
ebb0: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
ebc0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
ebd0: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
ebe0: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
ebf0: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
ec00: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
ec10: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
ec20: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
ec30: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
ec40: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ec50: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
ec60: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
ec70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ec80: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
ec90: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
eca0: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
ecb0: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
ecc0: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
ecd0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
ece0: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
ecf0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
ed00: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
ed10: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
ed20: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
ed30: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
ed40: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
ed50: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
ed60: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
ed70: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
ed80: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
ed90: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
eda0: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
edb0: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
edc0: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
edd0: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
ede0: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
edf0: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
ee00: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
ee10: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
ee20: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
ee30: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
ee40: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
ee50: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
ee60: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
ee70: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
ee80: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
ee90: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
eea0: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
eeb0: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
eec0: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
eed0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
eee0: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
eef0: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
ef00: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
ef10: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
ef20: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
ef30: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
ef40: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
ef50: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
ef60: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
ef70: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
ef80: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
ef90: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
efa0: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
efb0: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
efc0: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
efd0: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
efe0: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
eff0: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
f000: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
f010: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
f020: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
f030: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
f040: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
f050: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f060: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
f070: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
f080: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
f090: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
f0a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f0b0: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
f0c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f0d0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
f0e0: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
f0f0: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
f100: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
f110: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
f120: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
f130: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
f140: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
f150: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
f160: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
f170: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f180: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
f190: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
f1a0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
f1b0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
f1c0: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
f1d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
f1e0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
f1f0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
f200: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
f210: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
f220: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
f230: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
f240: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
f250: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
f260: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
f270: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
f280: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
f290: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
f2a0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
f2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f2c0: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
f2d0: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
f2e0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
f2f0: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
f300: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
f310: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
f320: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
f330: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
f340: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
f350: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
f360: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
f370: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
f380: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
f390: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
f3a0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
f3b0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
f3c0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
f3d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
f3e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
f3f0: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
f400: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
f410: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f420: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
f430: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
f440: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
f450: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
f460: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
f470: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
f480: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
f490: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
f4a0: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
f4b0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f4c0: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
f4d0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
f4e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f4f0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
f500: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f520: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
f530: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
f540: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
f550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f560: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
f570: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
f580: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
f590: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
f5a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f5b0: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
f5c0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
f5d0: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
f600: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
f610: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
f620: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f650: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
f660: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
f670: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
f680: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
f690: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
f6a0: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f6c0: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
f6d0: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
f6e0: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
f6f0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
f700: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
f710: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
f720: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
f730: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
f740: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
f750: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f760: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
f770: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
f780: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
f790: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
f7a0: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
f7b0: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
f7c0: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
f7d0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
f7e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
f7f0: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
f800: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
f810: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
f820: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
f830: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
f840: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
f850: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f860: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
f870: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
f880: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
f890: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
f8a0: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
f8b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
f8c0: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
f8d0: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
f8e0: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
f8f0: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
f900: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
f910: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
f920: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
f930: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
f940: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
f950: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
f960: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
f970: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
f980: 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
f990: 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
f9a0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
f9b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f9c0: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
f9d0: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
f9e0: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
f9f0: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
fa00: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fa10: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
fa20: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
fa30: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
fa40: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
fa50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
fa60: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
fa70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
fa80: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
fa90: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
faa0: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
fab0: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
fac0: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
fad0: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
fae0: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
faf0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
fb00: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
fb10: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
fb20: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
fb30: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
fb40: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
fb50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
fb60: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fb70: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fb80: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
fb90: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
fba0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fbb0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
fbc0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
fbd0: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
fbe0: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
fbf0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fc00: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
fc10: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
fc20: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
fc30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
fc40: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
fc50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
fc60: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
fc70: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
fc80: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
fc90: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
fca0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
fcb0: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
fcc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
fcd0: 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
fce0: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
fcf0: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  eader */..    /*
fd00: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
fd10: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
fd20: 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
fd30: 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
fd40: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
fd50: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
fd60: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
fd70: 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
fd80: 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
fd90: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
fda0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
fdb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fdc0: 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
fdd0: 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
fde0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fdf0: 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f  }..    /* Versio
fe00: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
fe10: 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20  or to 3.5.8 set 
fe20: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69  the page-size fi
fe30: 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  eld of the.    *
fe40: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
fe50: 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69   to zero. In thi
fe60: 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74  s case, assume t
fe70: 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61  hat the Pager.pa
fe80: 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61  geSize.    ** va
fe90: 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64  riable is alread
fea0: 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72  y set to the cor
feb0: 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a  rect page size..
fec0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
fed0: 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  PageSize==0 ){. 
fee0: 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d       iPageSize =
fef0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
ff00: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
ff10: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
ff20: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
ff30: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
ff40: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
ff50: 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
ff60: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
ff70: 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
ff80: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
ff90: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
ffa0: 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
ffb0: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
ffc0: 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
ffd0: 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
ffe0: 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
fff0: 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
10000 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
10010 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
10020 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
10030 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
10040 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
10050 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
10060 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
10070 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
10080 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
10090 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
100a0 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
100b0 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
100c0 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
100d0 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
100e0 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
100f0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
10100 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
10110 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
10120 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
10130 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10140 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
10150 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
10160 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
10170 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
10180 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
10190 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
101a0 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
101b0 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
101c0 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
101d0 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
101e0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
101f0 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
10200 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10210 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
10220 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
10230 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
10240 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10250 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
10260 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
10270 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
10280 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
10290 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
102a0 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
102b0 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
102c0 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
102d0 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
102e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
102f0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
10300 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a  Pager, &iPageSiz
10310 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  e, -1);.    test
10320 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
10330 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  _OK );..    /* U
10340 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
10350 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
10360 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10370 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
10380 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10390 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
103a0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
103b0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
103c0 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
103d0 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
103e0 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
103f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
10400 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
10410 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
10420 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
10430 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
10440 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
10450 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
10460 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
10470 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
10480 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
10490 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
104a0 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
104b0 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
104c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
104d0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
104e0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
104f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
10500 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
10510 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
10520 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
10530 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
10540 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
10550 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
10560 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
10570 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10580 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
10590 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
105a0 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
105b0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
105c0 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
105d0 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
105e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
105f0 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
10600 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
10610 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
10620 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
10630 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
10640 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
10650 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
10660 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
10670 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
10680 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
10690 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
106a0 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
106b0 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
106c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
106d0 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
106e0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
106f0 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
10700 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
10710 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
10720 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
10730 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
10740 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
10750 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
10760 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
10770 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
10780 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
10790 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
107a0 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
107b0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
107c0 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
107d0 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
107e0 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
107f0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
10800 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
10810 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
10820 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
10830 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
10840 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10850 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
10860 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
10870 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
10880 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
10890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
108a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
108b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
108c0 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108e0 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
108f0 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
10900 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
10930 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
10940 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
10950 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
10960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10970 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
10980 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
10990 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109b0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
109c0 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
109d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
109e0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
109f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10a00 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
10a10 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  ger) );..  if( !
10a20 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70  zMaster .   || p
10a30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10a40 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10a50 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
10a60 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
10a70 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
10a80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
10a90 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
10aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10ab0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
10ac0 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
10ad0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
10ae0 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
10af0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
10b00 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
10b10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a  >journalOff );..
10b20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
10b30 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74  he length in byt
10b40 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  es and the check
10b50 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a  sum of zMaster *
10b60 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d  /.  for(nMaster=
10b70 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  0; zMaster[nMast
10b80 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b  er]; nMaster++){
10b90 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
10ba0 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a  aster[nMaster];.
10bb0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
10bc0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10bd0 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
10be0 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
10bf0 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
10c00 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
10c10 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
10c20 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
10c30 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
10c40 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
10c50 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
10c60 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
10c70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
10c80 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
10c90 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
10ca0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
10cb0 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
10cc0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72  ger);.  }.  iHdr
10cd0 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
10ce0 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
10cf0 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
10d00 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f   journal data to
10d10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10d20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
10d30 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
10d40 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68  ccurs, return th
10d50 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
10d60 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f  the caller..  */
10d70 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63  .  if( (0 != (rc
10d80 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
10d90 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10da0 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
10db0 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20  NO(pPager)))).  
10dc0 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
10dd0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
10de0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
10df0 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48  ter, nMaster, iH
10e00 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c  drOff+4))).   ||
10e10 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
10e20 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
10e30 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
10e40 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  nMaster, nMaster
10e50 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
10e60 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
10e70 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10e80 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10e90 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20  +4, cksum))).   
10ea0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
10eb0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
10ec0 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
10ed0 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64  nalMagic, 8, iHd
10ee0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
10ef0 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
10f00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
10f10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10f20 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
10f30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
10f40 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
10f50 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
10f60 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
10f70 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
10f80 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
10f90 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
10fa0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
10fb0 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
10fc0 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
10fd0 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
10fe0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
10ff0 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
11000 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
11010 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
11020 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
11030 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
11040 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
11050 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
11060 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
11070 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
11080 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
11090 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
110a0 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
110b0 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
110c0 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
110d0 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
110e0 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
110f0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
11100 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
11110 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
11120 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
11130 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11140 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
11150 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
11160 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
11170 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
11180 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11190 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
111a0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
111b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
111c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
111d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
111e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
111f0 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
11200 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
11210 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
11220 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
11230 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
11240 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
11250 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
11260 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
11270 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
11280 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
11290 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
112a0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
112d0 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
112e0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
112f0 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
11300 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
11310 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
11320 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
11330 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
11340 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
11350 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
11360 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
11370 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
11380 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
11390 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
113a0 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
113b0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn p;.}../*.** D
113c0 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
113d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
113e0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
113f0 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11400 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11410 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11420 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  ){.  sqlite3Back
11430 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
11440 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71  ->pBackup);.  sq
11450 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
11460 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11470 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
11480 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11490 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
114a0 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
114b0 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
114c0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
114d0 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
114e0 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
114f0 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11500 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
11510 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
11520 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11530 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
11540 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
11550 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11560 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11570 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11590 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
115a0 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
115b0 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
115c0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
115d0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
115e0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
115f0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11600 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
11610 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
11620 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
11630 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
11640 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
11650 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
11660 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
11670 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11680 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
11690 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
116a0 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
116b0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
116c0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
116d0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
116e0 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
116f0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11700 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
11710 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
11720 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
11730 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
11740 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
11750 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
11760 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
11770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11780 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11790 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
117a0 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
117b0 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
117c0 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
117d0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
117e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
117f0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11800 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11810 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11820 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
11830 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11840 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
11850 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
11860 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11870 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11880 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11890 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
118a0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
118b0 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
118c0 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
118d0 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
118e0 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
118f0 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11900 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11910 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
11920 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
11930 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
11940 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
11950 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
11960 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11970 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11980 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11990 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  p if the pager i
119a0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
119b0 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69  ode and not.** i
119c0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
119d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
119e0 20 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61   switches the pa
119f0 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ger to PAGER_OPE
11a00 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  N.** state..**.*
11a10 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
11a20 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11a30 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20  ve-access mode, 
11a40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11a50 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  e is.** complete
11a60 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20  ly unlocked. If 
11a70 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
11a80 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c  cked and the fil
11a90 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a  e-system does.**
11aa0 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65   not exhibit the
11ab0 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45   UNDELETABLE_WHE
11ac0 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c  N_OPEN property,
11ad0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11ae0 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28  e is.** closed (
11af0 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a  if it is open)..
11b00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
11b10 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73  er is in ERROR s
11b20 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
11b30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
11b40 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  d, the .** conte
11b50 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
11b60 20 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61   cache are disca
11b70 72 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74  rded before swit
11b80 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a  ching back to .*
11b90 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  * the OPEN state
11ba0 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
11bb0 77 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65  whether the page
11bc0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11bd0 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74  e-mode.** or not
11be0 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69  , any journal fi
11bf0 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  le left in the f
11c00 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20  ile-system will 
11c10 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73  be treated.** as
11c20 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
11c30 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  nd rolled back t
11c40 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72  he next time a r
11c50 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
11c60 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79  ** is opened (by
11c70 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20   this or by any 
11c80 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11c90 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
11ca0 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
11cb0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
11cc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11cd0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11ce0 52 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c  READER .       |
11cf0 7c 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 4f 50 45 4e 20 0a 20 20  ==PAGER_OPEN .  
11d10 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
11d20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
11d30 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c  ROR .  );..  sql
11d40 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
11d50 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
11d60 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
11d70 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
11d80 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
11d90 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
11da0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
11db0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
11dc0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11dd0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
11de0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
11df0 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
11e00 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
11e10 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
11e20 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
11e30 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
11e40 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
11e50 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
11e60 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
11e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
11e80 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
11e90 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
11ea0 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
11eb0 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
11ec0 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
11ed0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
11ee0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
11ef0 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
11f00 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
11f10 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
11f20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
11f30 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
11f40 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
11f50 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
11f60 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
11f70 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
11f80 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
11f90 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11fa0 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
11fb0 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
11fc0 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
11fd0 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
11fe0 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
11ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12000 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12010 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
12020 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12030 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12040 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
12050 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
12060 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12070 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
12080 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12090 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
120a0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
120b0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
120c0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
120d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
120e0 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
120f0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12100 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
12110 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
12120 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
12130 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
12140 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
12150 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
12160 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
12170 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
12180 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
12190 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
121a0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
121b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
121c0 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
121d0 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
121e0 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
121f0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
12200 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
12210 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
12220 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
12230 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
12240 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
12250 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
12260 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
12270 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
12280 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
12290 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
122a0 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
122b0 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
122c0 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
122d0 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
122e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
122f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12300 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
12310 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
12320 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
12330 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
12340 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
12350 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
12360 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
12370 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
12380 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
12390 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
123a0 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
123b0 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
123c0 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
123d0 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
123e0 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
123f0 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
12400 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
12410 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12420 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
12430 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
12440 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
12450 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
12460 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
12470 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12480 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12490 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
124a0 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
124b0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
124c0 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
124d0 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
124e0 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
124f0 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
12500 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
12510 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
12520 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
12530 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
12540 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
12550 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
12560 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
12570 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
12580 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
12590 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  de..  */.  if( p
125a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
125b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
125c0 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
125d0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
125e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
125f0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
12600 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
12610 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12620 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
12630 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
12640 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
12650 4b 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45  K;.    if( USEFE
12660 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
12670 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
12680 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
12690 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
126a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
126b0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
126c0 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61  alHdr = 0;.  pPa
126d0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
126e0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
126f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
12700 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e  lled whenever an
12710 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65   IOERR or FULL e
12720 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72  rror that requir
12730 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  es.** the pager 
12740 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e  to transition in
12750 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
12760 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75  te may ahve occu
12770 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72  rred..** The fir
12780 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
12790 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
127a0 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
127b0 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
127c0 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
127d0 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
127e0 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
127f0 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  PI function. The
12800 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72   .** value retur
12810 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
12820 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12830 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
12840 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
12850 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12860 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46  ment is SQLITE_F
12870 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
12880 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a  R or one of the.
12890 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64  ** IOERR sub-cod
128a0 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e  es, the pager en
128b0 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73  ters the ERROR s
128c0 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72  tate and the err
128d0 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74  or code.** is st
128e0 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72  ored in Pager.er
128f0 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65  rCode. While the
12900 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69   pager remains i
12910 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
12920 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20  e,.** all major 
12930 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65  API calls on the
12940 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
12950 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50  diately return P
12960 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a  ager.errCode..**
12970 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74  .** The ERROR st
12980 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ate indicates th
12990 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
129a0 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
129b0 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
129c0 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
129d0 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
129e0 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
129f0 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
12a00 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12a10 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
12a20 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
12a30 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
12a40 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
12a50 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
12a60 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
12a70 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
12a80 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
12a90 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
12aa0 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
12ab0 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
12ac0 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
12ad0 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
12ae0 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
12af0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
12b00 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
12b10 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
12b20 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
12b30 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
12b40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
12b50 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
12b60 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12b70 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12b80 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
12b90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12ba0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
12bb0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
12bc0 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
12bd0 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
12be0 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
12bf0 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
12c00 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
12c10 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12c20 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61  de = rc;.    pPa
12c30 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12c40 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  GER_ERROR;.  }. 
12c50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
12c60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12c70 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
12c80 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
12c90 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ge);../*.** This
12ca0 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
12cb0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
12cc0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
12cd0 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
12ce0 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
12cf0 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
12d00 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
12d10 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
12d20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
12d30 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
12d40 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
12d50 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12d60 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
12d70 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
12d80 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
12d90 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
12da0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
12db0 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
12dc0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
12dd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12de0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
12df0 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  n PAGER_ERROR st
12e00 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61  ate. If it is ca
12e10 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52  lled.** in PAGER
12e20 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53  _NONE or PAGER_S
12e30 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20  HARED state and 
12e40 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73  the lock held is
12e50 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69   less.** exclusi
12e60 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56  ve than a RESERV
12e70 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61  ED lock, it is a
12e80 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74   no-op..**.** Ot
12e90 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
12ea0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
12eb0 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
12ec0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
12ed0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
12ee0 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
12ef0 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
12f00 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
12f10 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
12f20 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
12f30 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
12f40 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
12f50 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
12f60 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
12f70 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
12f80 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
12f90 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
12fa0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
12fb0 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
12fc0 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
12fd0 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
12fe0 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
12ff0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
13000 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
13010 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13020 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
13030 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
13040 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
13050 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
13060 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
13070 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
13080 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
13090 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
130a0 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
130b0 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
130c0 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
130d0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
130e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
130f0 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
13100 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
13110 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
13120 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
13130 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
13140 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
13150 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
13160 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
13170 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
13180 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
13190 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
131a0 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
131b0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
131c0 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
131d0 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
131e0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
131f0 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
13200 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
13210 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
13220 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
13230 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
13240 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
13250 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
13260 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
13270 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
13280 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
13290 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
132a0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
132b0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
132c0 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
132d0 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
132e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
132f0 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
13300 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
13310 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
13320 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
13330 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
13340 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
13350 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
13360 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
13370 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
13380 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
13390 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
133a0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
133b0 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  is finalized, th
133c0 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  e pager moves to
133d0 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
133e0 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69  ate..** If runni
133f0 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
13400 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  ive rollback mod
13410 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  e, the lock on t
13420 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64  he file is .** d
13430 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53  owngraded to a S
13440 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
13450 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
13460 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
13470 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
13480 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
13490 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
134a0 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
134b0 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
134c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
134d0 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
134e0 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
134f0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
13500 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
13510 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
13520 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
13530 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
13540 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
13550 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
13560 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
13570 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
13580 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
13590 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
135a0 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
135b0 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
135c0 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
135d0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
135e0 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
135f0 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
13600 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
13610 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
13620 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
13630 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
13640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13650 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
13660 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
13670 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
13680 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  er, int bCommit)
13690 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
136a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
136b0 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
136c0 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
136d0 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
136e0 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
136f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
13700 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
13710 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
13720 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  peration */..  /
13730 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
13740 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
13750 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  ot have an open 
13760 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13770 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61  n.  ** or at lea
13780 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
13790 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ck. This functio
137a0 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
137b0 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20  when there.  ** 
137c0 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
137d0 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62  saction active b
137e0 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ut a RESERVED or
137f0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
13800 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72  .  ** held under
13810 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
13820 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  es:.  **.  **   
13830 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65  1. After a succe
13840 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61  ssful hot-journa
13850 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
13860 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20  s called with.  
13870 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d  **      eState==
13880 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65  PAGER_NONE and e
13890 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
138a0 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  LOCK..  **.  ** 
138b0 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63    2. If a connec
138c0 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e  tion with lockin
138d0 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
138e0 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
138f0 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20  USIVE .  **     
13900 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62   lock switches b
13910 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d  ack to locking_m
13920 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74  ode=normal and t
13930 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20  hen executes a. 
13940 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72   **      read-tr
13950 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
13960 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13970 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d  ed with eState==
13980 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
13990 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63  **      and eLoc
139a0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
139b0 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d  K when the read-
139c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
139d0 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  losed..  */.  as
139e0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
139f0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
13a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
13a10 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
13a20 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  GER_ERROR );.  i
13a30 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
13a40 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e<PAGER_WRITER_L
13a50 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d  OCKED && pPager-
13a60 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f  >eLock<RESERVED_
13a70 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
13a80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13a90 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  }..  releaseAllS
13aa0 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
13ab0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
13ac0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
13ad0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a   || pPager->pInJ
13ae0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69  ournal==0 );.  i
13af0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
13b00 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73  ->jfd) ){.    as
13b10 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
13b20 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
13b30 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74     /* Finalize t
13b40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13b50 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
13b60 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
13b70 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
13b80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13b90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13ba0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13bb0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
13bc0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
13bd0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
13be0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13bf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13c00 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13c10 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
13c20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
13c30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
13c40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
13c50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13c80 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
13c90 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
13ca0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
13cb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
13cc0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13cd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13ce0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13cf0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
13d00 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
13d10 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
13d20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13d30 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
13d40 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
13d50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
13d60 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
13d70 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
13d80 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
13d90 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13db0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
13dc0 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20  may be executed 
13dd0 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e  with Pager.journ
13de0 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69  alMode==MEMORY i
13df0 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74  f.      ** a hot
13e00 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73  -journal was jus
13e10 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  t rolled back. I
13e20 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
13e30 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
13e40 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
13e50 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
13e60 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e  ed. If this conn
13e70 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f  ection writes to
13e80 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
13e90 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20  tabase file, it 
13ea0 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67  will do so using
13eb0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
13ec0 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f  urnal. .      */
13ed0 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65  .      int bDele
13ee0 74 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74  te = (!pPager->t
13ef0 65 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74  empFile && sqlit
13f00 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28  e3JournalExists(
13f10 70 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20  pPager->jfd));. 
13f20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
13f30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13f40 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13f50 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20  ODE_DELETE .    
13f60 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
13f70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13f80 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13f90 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20  _MEMORY .       
13fa0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
13fb0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13fc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
13fd0 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
13fe0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
13ff0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
14000 20 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65       if( bDelete
14010 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14020 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
14030 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
14040 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
14050 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
14060 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
14070 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
14080 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  S.  sqlite3Pcach
14090 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
140a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
140b0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
140c0 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
140d0 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73  ->dbSize==0 && s
140e0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
140f0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
14100 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50  ache)>0 ){.    P
14110 67 48 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f  gHdr *p = pager_
14120 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31  lookup(pPager, 1
14130 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
14140 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73        p->pageHas
14150 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  h = 0;.      sql
14160 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
14170 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a  tNull(p);.    }.
14180 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
14190 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
141a0 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
141b0 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
141c0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
141d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
141e0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
141f0 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
14200 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
14210 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54    sqlite3PcacheT
14220 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
14230 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d  pPCache, pPager-
14240 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  >dbSize);..  if(
14250 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
14260 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ger) ){.    /* D
14270 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74  rop the WAL writ
14280 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20  e-lock, if any. 
14290 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e  Also, if the con
142a0 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a  nection was in .
142b0 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d      ** locking_m
142c0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
142d0 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e  de but is no lon
142e0 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58  ger, drop the EX
142f0 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20  CLUSIVE .    ** 
14300 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
14310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
14320 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d      */.    rc2 =
14330 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72   sqlite3WalEndWr
14340 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
14350 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
14360 20 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53    assert( rc2==S
14370 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65  QLITE_OK );.  }e
14380 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
14390 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74  TE_OK && bCommit
143a0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69   && pPager->dbFi
143b0 6c 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64  leSize>pPager->d
143c0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  bSize ){.    /* 
143d0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
143e0 61 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74  aken when commit
143f0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
14400 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a  on in rollback-j
14410 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f  ournal.    ** mo
14420 64 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  de if the databa
14430 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  se file on disk 
14440 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
14450 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
14460 65 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69  e..    ** At thi
14470 73 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72  s point the jour
14480 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e  nal has been fin
14490 61 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74  alized and the t
144a0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
144b0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
144c0 63 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74  committed, but t
144d0 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
144e0 6b 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  k is still held 
144f0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  on the.    ** fi
14500 6c 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66  le. So it is saf
14510 65 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  e to truncate th
14520 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14530 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20  to its minimum. 
14540 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73     ** required s
14550 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ize.  */.    ass
14560 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
14570 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
14580 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  CK );.    rc = p
14590 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
145a0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62  ager, pPager->db
145b0 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Size);.  }..  if
145c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
145d0 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73  && bCommit && is
145e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
145f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14600 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
14610 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
14620 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49  LITE_FCNTL_COMMI
14630 54 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a  T_PHASETWO, 0);.
14640 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14650 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63  TE_NOTFOUND ) rc
14660 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14670 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
14680 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14690 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73  .   && (!pagerUs
146a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20  eWal(pPager) || 
146b0 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
146c0 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
146d0 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20  pWal, 0)).  ){. 
146e0 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e     rc2 = pagerUn
146f0 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
14700 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
14710 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
14720 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
14730 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  }.  pPager->eSta
14740 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
14750 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  R;.  pPager->set
14760 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
14770 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
14780 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
14790 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
147a0 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
147b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
147c0 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
147d0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
147e0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
147f0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
14800 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
14810 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
14820 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a  do not attempt .
14830 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
14840 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e  at this time. In
14850 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c  stead, pager_unl
14860 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ock() is called.
14870 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   The.** call to 
14880 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
14890 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20  ill discard all 
148a0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c  in-memory pages,
148b0 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64   unlock.** the d
148c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
148d0 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20   move the pager 
148e0 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
148f0 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20  te. If this .** 
14900 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
14910 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
14920 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
14930 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
14940 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ext .** connecti
14950 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  on to obtain a s
14960 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
14970 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
14980 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
14990 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74  .** will roll it
149a0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
149b0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
149c0 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
149d0 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
149e0 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
149f0 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
14a00 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
14a10 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
14a20 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
14a30 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
14a40 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
14a50 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68   ERROR state. Wh
14a60 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
14a70 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
14a80 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
14a90 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
14aa0 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
14ab0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
14ac0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
14ad0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14ae0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
14af0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
14b00 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
14b10 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
14b20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
14b30 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
14b40 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  e(pPager) );.   
14b50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
14b60 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
14b70 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
14b80 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
14b90 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
14ba0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14bb0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
14bc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14bd0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
14be0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14bf0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
14c00 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
14c10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14c20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
14c30 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61  ADER );.      pa
14c40 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
14c50 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30  ion(pPager, 0, 0
14c60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
14c70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
14c80 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  er);.}../*.** Pa
14c90 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75  rameter aData mu
14ca0 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
14cb0 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e  ffer of pPager->
14cc0 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a  pageSize bytes.*
14cd0 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75  * of data. Compu
14ce0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
14cf0 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
14d00 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nt the contents 
14d10 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
14d20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  of data and the 
14d30 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
14d40 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
14d50 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  it..**.** This i
14d60 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
14d70 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61  cksum. It is rea
14d80 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
14d90 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
14da0 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
14db0 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   (pPager->cksumI
14dc0 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32  nit) and every 2
14dd0 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20  00th byte.** of 
14de0 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73  the page data, s
14df0 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74  tarting with byt
14e00 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72  e offset (pPager
14e10 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e  ->pageSize%200).
14e20 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73  .** Each byte is
14e30 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
14e40 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65  an 8-bit unsigne
14e50 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  d integer..**.**
14e60 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f   Changing the fo
14e70 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f  rmula used to co
14e80 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b  mpute this check
14e90 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61  sum results in a
14ea0 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n.** incompatibl
14eb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
14ec0 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
14ed0 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
14ee0 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
14ef0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
14f00 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
14f10 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69  y .** scenario i
14f20 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
14f30 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
14f40 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
14f50 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  e changed. .** I
14f60 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c  t is much less l
14f70 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
14f80 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
14f90 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
14fa0 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
14fb0 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
14fc0 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
14fd0 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
14fe0 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
14ff0 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
15000 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
15010 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
15020 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
15030 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  on..*/.static u3
15040 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
15050 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
15060 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
15070 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
15080 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20  ger->cksumInit; 
15090 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
150a0 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74  sum value to ret
150b0 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  urn */.  int i =
150c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
150d0 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20  e-200;          
150e0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
150f0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  */.  while( i>0 
15100 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
15110 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
15120 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
15130 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
15140 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20  *.** Report the 
15150 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a  current page siz
15160 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
15170 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62  reserved bytes b
15180 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ack.** to the co
15190 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  dec..*/.#ifdef S
151a0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
151b0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
151c0 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65  rReportSize(Page
151d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
151e0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
151f0 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20  SizeChng ){.    
15200 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
15210 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70  zeChng(pPager->p
15220 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70  Codec, pPager->p
15230 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d      (int)pPager-
15260 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a  >nReserve);.  }.
15270 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
15280 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
15290 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70  (X)     /* No-op
152a0 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75   if we do not su
152b0 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f  pport a codec */
152c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
152d0 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67  ead a single pag
152e0 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68  e from either th
152f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
15300 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31  if isMainJrnl==1
15310 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  ) or.** from the
15320 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66   sub-journal (if
15330 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20   isMainJrnl==0) 
15340 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61  and playback tha
15350 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70  t page..** The p
15360 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66  age begins at of
15370 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e  fset *pOffset in
15380 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65  to the file. The
15390 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c   *pOffset.** val
153a0 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20  ue is increased 
153b0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
153c0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
153d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
153e0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c  .** The main rol
153f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73  lback journal us
15400 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74  es checksums - t
15410 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
15420 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f  rnal does .** no
15430 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
15440 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
15450 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72  he page record r
15460 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
15470 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
15480 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
15490 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  an the current v
154a0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
154b0 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62  Size, then playb
154c0 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65  ack is.** skippe
154d0 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
154e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
154f0 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e  ** If pDone is n
15500 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
15510 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20   is a record of 
15520 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20  pages that have 
15530 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
15540 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66  played back.  If
15550 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f   the page at *pO
15560 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64  ffset has alread
15570 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  y been played ba
15580 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f  ck.** (if the co
15590 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e  rresponding pDon
155a0 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68  e bit is set) th
155b0 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79  en skip the play
155c0 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75  back..** Make su
155d0 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74  re the pDone bit
155e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
155f0 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70  o the *pOffset p
15600 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72  age is set.** pr
15610 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67  ior to returning
15620 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
15630 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75  age record is su
15640 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
15650 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
15660 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61  ournal file.** a
15670 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20  nd played back, 
15680 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
15690 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
156a0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
156b0 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69  s.** while readi
156c0 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72  ng the record fr
156d0 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
156e0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69  rnal file or whi
156f0 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f  le writing.** to
15700 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15710 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  le, then the IO 
15720 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
15730 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a  turned. If data.
15740 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ** is successful
15750 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
15760 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
15770 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20  ile but appears 
15780 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74  to be.** corrupt
15790 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
157a0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74  is returned. Dat
157b0 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  a is considered 
157c0 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20  corrupted in.** 
157d0 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
157e0 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66  s:.** .**   * If
157f0 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65   the record page
15800 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67  -number is illeg
15810 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d  al (0 or PAGER_M
15820 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20  J_PGNO), or.**  
15830 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
15840 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
15850 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
15860 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
15870 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20  .**     and the 
15880 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64  checksum field d
15890 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
158a0 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74  e record content
158b0 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20  ..**.** Neither 
158c0 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65  of these two sce
158d0 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69  narios are possi
158e0 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76  ble during a sav
158f0 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  epoint rollback.
15900 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
15910 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  s a savepoint ro
15920 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d  llback, then mem
15930 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20  ory may have to 
15940 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a  be dynamically.*
15950 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
15960 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  his function. If
15970 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
15980 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74  e and an allocat
15990 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51  ion fails,.** SQ
159a0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
159b0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
159c0 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
159d0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20  back_one_page(. 
159e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a00 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e  * The pager bein
15a10 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  g played back */
15a20 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c  .  i64 *pOffset,
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a40 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65   /* Offset of re
15a50 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b  cord to playback
15a60 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
15a70 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  one,            
15a80 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66      /* Bitvec of
15a90 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70   pages already p
15aa0 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
15ab0 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20  int isMainJrnl, 
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ad0 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e   1 -> main journ
15ae0 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75  al. 0 -> sub-jou
15af0 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  rnal. */.  int i
15b00 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20  sSavepnt        
15b10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
15b20 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74   for a savepoint
15b30 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a   rollback */.){.
15b40 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
15b50 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
15b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
15b70 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
15b80 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
15b90 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15bb0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
15bc0 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
15bd0 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
15be0 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
15bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
15c00 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
15c10 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
15c20 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20  .  char *aData; 
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74   /* Temporary st
15c50 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61  orage for the pa
15c60 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ge */.  sqlite3_
15c70 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
15c80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
15c90 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
15ca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
15cb0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e  e */.  int isSyn
15cc0 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ced;            
15cd0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
15ce0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20  journal page is 
15cf0 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73  synced */..  ass
15d00 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
15d10 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
15d20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
15d30 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
15d40 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
15d50 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
15d60 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
15d70 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
15d80 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
15d90 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
15da0 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
15db0 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
15dc0 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
15dd0 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
15de0 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
15df0 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
15e00 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
15e10 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70   */..  aData = p
15e20 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
15e30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
15e40 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  a );         /* 
15e50 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73  Temp storage mus
15e60 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
15e70 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
15e80 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
15e90 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
15ea0 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e  0 || (!isMainJrn
15eb0 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20  l && isSavepnt) 
15ec0 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20  );..  /* Either 
15ed0 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65  the state is gre
15ee0 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f  ater than PAGER_
15ef0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
15f00 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  (a transaction .
15f10 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
15f20 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20  t rollback done 
15f30 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f  at the request o
15f40 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72  f the caller) or
15f50 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20   this is.  ** a 
15f60 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
15f70 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61  back. If it is a
15f80 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
15f90 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72  lback, the pager
15fa0 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74  .  ** is in stat
15fb0 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73  e OPEN and holds
15fc0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
15fd0 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ck. Hot-journal 
15fe0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e  rollback.  ** on
15ff0 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68  ly reads from th
16000 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  e main journal, 
16010 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  not the sub-jour
16020 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
16030 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
16040 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
16050 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
16060 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74   || (pPager->eSt
16070 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
16080 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
16090 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
160a0 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ).  );.  assert(
160b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
160c0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
160d0 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e  CHEMOD || isMain
160e0 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  Jrnl );..  /* Re
160f0 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
16100 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61  er and page data
16110 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
16120 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
16130 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75  .  ** file. Retu
16140 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
16150 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
16160 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
16170 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64  curs..  */.  jfd
16180 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20   = isMainJrnl ? 
16190 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
161a0 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63  ager->sjfd;.  rc
161b0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
161c0 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67  d, *pOffset, &pg
161d0 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
161e0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
161f0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
16200 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
16210 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
16220 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a  er->pageSize, (*
16230 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69  pOffset)+4);.  i
16240 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16250 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16260 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67  *pOffset += pPag
16270 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
16280 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b   + isMainJrnl*4;
16290 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
162a0 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
162b0 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
162c0 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
162d0 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
162e0 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
162f0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
16300 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
16310 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
16320 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
16330 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
16340 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
16350 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
16360 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
16370 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
16380 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
16390 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
163a0 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
163b0 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
163c0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
163d0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
163e0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
163f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
16400 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
16410 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
16420 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
16430 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d  no>(Pgno)pPager-
16440 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74  >dbSize || sqlit
16450 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f  e3BitvecTest(pDo
16460 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  ne, pgno) ){.   
16470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16480 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d  K;.  }.  if( isM
16490 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72  ainJrnl ){.    r
164a0 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
164b0 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34  fd, (*pOffset)-4
164c0 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
164d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
164e0 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61  c;.    if( !isSa
164f0 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63  vepnt && pager_c
16500 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
16510 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  *)aData)!=cksum 
16520 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16530 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
16540 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
16550 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c  this page has al
16560 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
16570 64 20 62 79 20 62 65 66 6f 72 65 20 64 75 72 69  d by before duri
16580 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  ng the current. 
16590 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68   ** rollback, th
165a0 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  en don't bother 
165b0 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20  to play it back 
165c0 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
165d0 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
165e0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
165f0 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
16600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16610 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16620 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79  ..  /* When play
16630 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c  ing back page 1,
16640 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65   restore the nRe
16650 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20  serve setting.  
16660 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  */.  if( pgno==1
16670 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73   && pPager->nRes
16680 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74  erve!=((u8*)aDat
16690 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50  a)[20] ){.    pP
166a0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
166b0 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30   ((u8*)aData)[20
166c0 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  ];.    pagerRepo
166d0 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
166e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
166f0 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43   pager is in CAC
16700 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65  HEMOD state, the
16710 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
16720 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
16730 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
16740 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
16750 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
16760 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
16770 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
16780 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16790 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
167a0 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
167b0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
167c0 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
167d0 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
167e0 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
167f0 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
16800 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
16810 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
16820 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
16830 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
16840 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
16850 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
16860 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
16870 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
16880 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
16890 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
168a0 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
168b0 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
168c0 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
168d0 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
168e0 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
168f0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
16900 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
16910 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
16920 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
16930 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
16940 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52   ** If in WRITER
16950 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46  _DBMOD, WRITER_F
16960 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20  INISHED or OPEN 
16970 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
16980 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70  pdate the.  ** p
16990 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
169a0 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20   exists and the 
169b0 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
169c0 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
169d0 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72  ed .  ** not dir
169e0 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63  ty. Since this c
169f0 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63  ode is only exec
16a00 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50  uted in PAGER_OP
16a10 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a  EN state for.  *
16a20 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
16a30 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
16a40 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
16a50 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69  the page-cache i
16a60 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20  s empty.  ** if 
16a70 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
16a80 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a  OPEN state..  **
16a90 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
16aa0 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
16ab0 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
16ac0 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
16ad0 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
16ae0 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
16af0 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
16b00 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
16b10 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
16b20 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
16b30 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
16b40 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
16b50 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
16b60 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
16b70 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
16b80 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
16b90 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
16ba0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
16bb0 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
16bc0 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
16bd0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
16be0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
16bf0 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
16c00 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
16c10 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
16c20 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
16c30 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
16c40 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
16c50 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
16c60 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
16c70 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
16c80 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
16c90 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
16ca0 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
16cb0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
16cc0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
16cd0 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
16ce0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
16cf0 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
16d00 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
16d10 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
16d20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
16d30 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
16d40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
16d50 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
16d60 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
16d70 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
16d80 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
16d90 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
16da0 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
16db0 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
16dc0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
16dd0 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
16de0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
16df0 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
16e00 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
16e10 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
16e20 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
16e30 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
16e40 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
16e50 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
16e60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
16e70 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
16e80 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
16e90 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
16ea0 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
16eb0 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
16ec0 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
16ed0 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
16ee0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
16ef0 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
16f00 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  d..  */.  if( pa
16f10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
16f20 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  ) ){.    pPg = 0
16f30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
16f40 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
16f50 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
16f60 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
16f70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  Pg || !MEMDB );.
16f80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16f90 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
16fa0 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29  OPEN || pPg==0 )
16fb0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
16fc0 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
16fd0 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20  e %d hash(%08x) 
16fe0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
16ff0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
17000 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
17010 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
17020 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61  pageSize, (u8*)a
17030 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20  Data),.         
17040 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d    (isMainJrnl?"m
17050 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75  ain-journal":"su
17060 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29  b-journal").  ))
17070 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  ;.  if( isMainJr
17080 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63  nl ){.    isSync
17090 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ed = pPager->noS
170a0 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74  ync || (*pOffset
170b0 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
170c0 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65  nalHdr);.  }else
170d0 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
170e0 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28   (pPg==0 || 0==(
170f0 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
17100 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a  DR_NEED_SYNC));.
17110 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e    }.  if( isOpen
17120 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
17130 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
17140 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
17150 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
17160 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
17170 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79  OPEN).   && isSy
17180 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36  nced.  ){.    i6
17190 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31  4 ofst = (pgno-1
171a0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
171b0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73  ageSize;.    tes
171c0 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70 6e  tcase( !isSavepn
171d0 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20 28  t && pPg!=0 && (
171e0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
171f0 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29  _NEED_SYNC)!=0 )
17200 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
17210 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
17220 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r) );.    rc = s
17230 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
17240 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29  ager->fd, (u8 *)
17250 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
17260 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a  ageSize, ofst);.
17270 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
17280 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
17290 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
172a0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
172b0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  no;.    }.    if
172c0 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  ( pPager->pBacku
172d0 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43  p ){.      CODEC
172e0 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  1(pPager, aData,
172f0 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c   pgno, 3, rc=SQL
17300 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
17310 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
17320 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
17330 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
17340 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  *)aData);.      
17350 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
17360 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
17370 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  c=SQLITE_NOMEM, 
17380 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
17390 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69  }else if( !isMai
173a0 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20  nJrnl && pPg==0 
173b0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
173c0 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s is a rollback 
173d0 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61  of a savepoint a
173e0 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20  nd data was not 
173f0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a  written to.    *
17400 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
17410 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
17420 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68  ot in-memory, th
17430 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69  ere is a potenti
17440 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65  al.    ** proble
17450 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65  m. When the page
17460 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64   is next fetched
17470 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c   by the b-tree l
17480 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a  ayer, it .    **
17490 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72   will be read fr
174a0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
174b0 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20  file, which may 
174c0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20  or may not be . 
174d0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a     ** current. .
174e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
174f0 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65  ere are a couple
17500 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61   of different wa
17510 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ys this can happ
17520 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74  en. All are quit
17530 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65  e.    ** obscure
17540 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  . When running i
17550 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  n synchronous mo
17560 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c  de, this can onl
17570 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a  y happen .    **
17580 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
17590 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
175a0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
175b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
175c0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f  , then.    ** po
175d0 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f  pulated, then mo
175e0 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ved using sqlite
175f0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29  3PagerMovepage()
17600 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17610 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
17620 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d  to add an in-mem
17630 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20  ory page to the 
17640 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cache containing
17650 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
17660 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
17670 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
17680 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
17690 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20  s dirty .    ** 
176a0 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72  and if the pager
176b0 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72   requires a jour
176c0 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d  nal-sync, then m
176d0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
176e0 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e  .    ** requirin
176f0 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  g a journal-sync
17700 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72   before it is wr
17710 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
17720 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
17730 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pnt );.    asser
17740 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
17750 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
17760 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20  AG_ROLLBACK)==0 
17770 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
17780 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49  oNotSpill |= SPI
17790 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b  LLFLAG_ROLLBACK;
177a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
177b0 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50  3PagerAcquire(pP
177c0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67  ager, pgno, &pPg
177d0 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
177e0 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  ( (pPager->doNot
177f0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
17800 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29  G_ROLLBACK)!=0 )
17810 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
17820 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
17830 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b  LLFLAG_ROLLBACK;
17840 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
17850 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
17860 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61  rc;.    pPg->fla
17870 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
17880 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69  D_READ;.    sqli
17890 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
178a0 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
178b0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
178c0 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
178d0 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
178e0 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
178f0 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
17900 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
17910 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
17920 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
17930 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
17940 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
17950 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
17960 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
17970 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
17980 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
17990 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
179a0 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
179b0 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
179c0 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
179d0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
179e0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
179f0 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
17a00 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
17a10 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
17a20 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
17a30 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61  (pData, (u8*)aDa
17a40 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
17a50 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
17a60 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
17a70 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69  );.    if( isMai
17a80 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76  nJrnl && (!isSav
17a90 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74  epnt || *pOffset
17aa0 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
17ab0 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f  lHdr) ){.      /
17ac0 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  * If the content
17ad0 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77  s of this page w
17ae0 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65  ere just restore
17af0 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  d from the main 
17b00 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
17b10 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73  l file, then its
17b20 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65   content must be
17b30 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68   as they were wh
17b40 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
17b50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
17b60 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49   first opened. I
17b70 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63  n this case we c
17b80 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  an mark the page
17b90 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65  .      ** as cle
17ba0 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  an, since there 
17bb0 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20  will be no need 
17bc0 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20  to write it out 
17bd0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
17be0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
17bf0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  **.      ** Ther
17c00 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69  e is one excepti
17c10 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e  on to this rule.
17c20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
17c30 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20  being rolled.   
17c40 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61     ** back as pa
17c50 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  rt of a savepoin
17c60 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29  t (or statement)
17c70 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61   rollback from a
17c80 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79  n .      ** unsy
17c90 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
17ca0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
17cb0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
17cc0 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20  s not safe.     
17cd0 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20   ** to mark the 
17ce0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54  page as clean. T
17cf0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d  his is because m
17d00 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20  arking the page 
17d10 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61  as.      ** clea
17d20 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65  n will clear the
17d30 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
17d40 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65   flag. Since the
17d50 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a   page is.      *
17d60 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
17d70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72   journal file (r
17d80 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72  ecorded in Pager
17d90 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64  .pInJournal) and
17da0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
17db0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
17dc0 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69  ag is cleared, i
17dd0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72  f the page is wr
17de0 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a  itten to.      *
17df0 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  * again within t
17e00 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
17e10 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b   it will be mark
17e20 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a  ed as dirty but.
17e30 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
17e40 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
17e50 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65  g will not be se
17e60 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e  t. It could then
17e70 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20   potentially.   
17e80 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e     ** be written
17e90 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61   out into the da
17ea0 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
17eb0 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  re its journal f
17ec0 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67  ile.      ** seg
17ed0 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20  ment is synced. 
17ee0 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72  If a crash occur
17ef0 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c  s during or foll
17f00 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20  owing this,.    
17f10 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f    ** database co
17f20 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73  rruption may ens
17f30 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ue..      */.   
17f40 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
17f50 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
17f60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17f70 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
17f80 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
17f90 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
17fa0 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a  sh(pPg);..    /*
17fb0 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67   If this was pag
17fc0 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72  e 1, then restor
17fd0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  e the value of P
17fe0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e  ager.dbFileVers.
17ff0 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20  .    ** Do this 
18000 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64  before any decod
18010 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ing. */.    if( 
18020 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
18030 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
18040 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
18050 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73  u8*)pData)[24],s
18060 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
18070 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
18080 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
18090 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72   the page just r
180a0 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f  ead from disk */
180b0 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
180c0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
180d0 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49  pgno, 3, rc=SQLI
180e0 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73  TE_NOMEM);.    s
180f0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
18100 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
18110 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18120 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
18130 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
18140 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
18150 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
18160 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
18170 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
18180 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
18190 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
181a0 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
181b0 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
181c0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
181d0 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
181e0 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
181f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18200 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
18210 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
18220 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
18230 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
18240 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
18250 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
18260 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
18270 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
18280 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
18290 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ion..**.** When 
182a0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
182b0 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
182c0 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65  , it is populate
182d0 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73  d with the names
182e0 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69   .** of all of i
182f0 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ts child journal
18300 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f  s, one after ano
18310 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20  ther, formatted 
18320 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63  as utf-8 .** enc
18330 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65  oded text. The e
18340 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64  nd of each child
18350 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
18360 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a   marked with a .
18370 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
18380 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69  r byte (0x00). i
18390 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63  .e. the entire c
183a0 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73  ontents of a mas
183b0 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  ter journal.** f
183c0 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61  ile for a transa
183d0 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20  ction involving 
183e0 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69  two databases mi
183f0 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ght be:.**.**   
18400 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62  "/home/bill/a.db
18410 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d  -journal\x00/hom
18420 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72  e/bill/b.db-jour
18430 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41  nal\x00".**.** A
18440 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18450 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  file may only be
18460 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c   deleted once al
18470 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a  l of its child .
18480 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65  ** journals have
18490 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
184a0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  k..**.** This fu
184b0 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65  nction reads the
184c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
184d0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
184e0 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65  file into .** me
184f0 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74  mory and loops t
18500 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74  hrough each of t
18510 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
18520 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65   names. For.** e
18530 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
18540 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a  l, it checks if:
18550 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68  .**.**   * if th
18560 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
18570 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73  exists, and if s
18580 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  o.**   * if the 
18590 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f  child journal co
185a0 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e  ntains a referen
185b0 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ce to master jou
185c0 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c  rnal .**     fil
185d0 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  e zMaster.**.** 
185e0 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e  If a child journ
185f0 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  al can be found 
18600 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74  that matches bot
18610 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69  h of the criteri
18620 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73  a.** above, this
18630 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
18640 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  s without doing 
18650 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77  anything. Otherw
18660 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75  ise, if.** no su
18670 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
18680 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66   can be found, f
18690 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64  ile zMaster is d
186a0 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  eleted from.** t
186b0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75  he file-system u
186c0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
186d0 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  lete()..**.** If
186e0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74   an IO error wit
186f0 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
18700 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  n, an error code
18710 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
18720 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
18730 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20  llocates memory 
18740 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
18750 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61  e3Malloc(). If a
18760 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  n allocation.** 
18770 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
18780 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
18790 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
187a0 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65  o IO or malloc e
187b0 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c  rrors .** occur,
187c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
187d0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  turned..**.** TO
187e0 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  DO: This functio
187f0 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69  n allocates a si
18800 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65  ngle block of me
18810 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  mory to load.** 
18820 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
18830 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
18840 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
18850 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  This could be.**
18860 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c   a couple of kil
18870 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70  obytes or so - p
18880 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65  otentially large
18890 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20  r than the page 
188a0 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  .** size..*/.sta
188b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
188c0 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
188d0 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
188e0 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
188f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
18900 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
18910 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18930 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
18940 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
18950 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61  Master;    /* Ma
18960 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f  lloc'd master-jo
18970 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
18980 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
18990 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  e3_file *pJourna
189a0 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  l;   /* Malloc'd
189b0 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66   child-journal f
189c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
189d0 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
189e0 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
189f0 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
18a00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18a10 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
18a20 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
18a30 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
18a40 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
18a50 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
18a60 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  al;           /*
18a70 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20   Pointer to one 
18a80 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d  journal within M
18a90 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  J file */.  char
18aa0 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20   *zMasterPtr;   
18ab0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74        /* Space t
18ac0 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61  o hold MJ filena
18ad0 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61  me from a journa
18ae0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
18af0 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  nMasterPtr;     
18b00 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20        /* Amount 
18b10 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
18b20 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72  ed to zMasterPtr
18b30 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  [] */..  /* Allo
18b40 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
18b50 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
18b60 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
18b70 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
18b80 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
18b90 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
18ba0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18bb0 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
18bc0 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
18bd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
18be0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
18bf0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
18c00 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
18c10 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
18c20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
18c30 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
18c40 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
18c50 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
18c60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
18c80 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
18c90 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
18ca0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
18cb0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
18cc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18cd0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
18ce0 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
18cf0 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
18d00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18d10 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
18d20 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c  ter_out;..  /* L
18d30 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
18d40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18d50 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
18d60 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a  tained from.  **
18d70 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
18d80 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
18d90 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
18da0 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69  al.   Also obtai
18db0 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e  n.  ** sufficien
18dc0 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73  t space (in zMas
18dd0 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20  terPtr) to hold 
18de0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73  the names of mas
18df0 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ter.  ** journal
18e00 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64   files extracted
18e10 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f   from regular ro
18e20 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e  llback-journals.
18e30 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
18e40 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
18e50 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
18e60 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
18e70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18e80 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18e90 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72  ut;.  nMasterPtr
18ea0 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
18eb0 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72  ame+1;.  zMaster
18ec0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
18ed0 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61  3Malloc((int)nMa
18ee0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
18ef0 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20  asterPtr + 1);. 
18f00 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
18f10 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  rnal ){.    rc =
18f20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18f30 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
18f40 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61  r_out;.  }.  zMa
18f50 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74  sterPtr = &zMast
18f60 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
18f70 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72  rJournal+1];.  r
18f80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
18f90 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(pMaster, zMast
18fa0 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29  erJournal, (int)
18fb0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
18fc0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
18fd0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18fe0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18ff0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
19000 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d  MasterJournal] =
19010 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20   0;..  zJournal 
19020 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
19030 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75  ;.  while( (zJou
19040 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
19050 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
19060 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  nal ){.    int e
19070 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20  xists;.    rc = 
19080 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
19090 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
190a0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
190b0 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
190c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
190d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
190e0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
190f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
19100 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
19110 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
19120 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
19130 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
19140 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
19150 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69  .      ** Open i
19160 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
19170 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
19180 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
19190 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  If.      ** so, 
191a0 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
191b0 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
191c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
191d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
191e0 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74  int c;.      int
191f0 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
19200 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
19210 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
19220 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
19230 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
19240 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  en(pVfs, zJourna
19250 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61  l, pJournal, fla
19260 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  gs, 0);.      if
19270 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19280 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
19290 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
192a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63       }..      rc
192b0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
192c0 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
192d0 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
192e0 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71  erPtr);.      sq
192f0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f  lite3OsClose(pJo
19300 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  urnal);.      if
19310 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19320 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
19330 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
19340 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20       }..      c 
19350 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
19360 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
19370 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
19380 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20  )==0;.      if( 
19390 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  c ){.        /* 
193a0 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
193b0 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
193c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
193d0 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
193e0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
193f0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
19400 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61     }.    zJourna
19410 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72  l += (sqlite3Str
19420 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b  len30(zJournal)+
19430 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69  1);.  }. .  sqli
19440 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
19450 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  er);.  rc = sqli
19460 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
19470 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
19480 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
19490 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
194a0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
194b0 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a   if( pMaster ){.
194c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
194d0 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  se(pMaster);.   
194e0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
194f0 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20  (pJournal) );.  
19500 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
19510 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72  Master);.  }.  r
19520 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
19530 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19540 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61  n is used to cha
19550 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73  nge the actual s
19560 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
19570 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20  ase .** file in 
19580 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
19590 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
195a0 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ns when committi
195b0 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
195c0 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  ,.** or rolling 
195d0 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
195e0 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f  on (including ro
195f0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
19600 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a  -journal)..**.**
19610 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   If the main dat
19620 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
19630 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70  t open, or the p
19640 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
19650 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f  ither.** DBMOD o
19660 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
19670 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
19680 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
19690 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20  e, the size .** 
196a0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  of the file is c
196b0 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20  hanged to nPage 
196c0 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61  pages (nPage*pPa
196d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
196e0 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65  tes). .** If the
196f0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
19700 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65   currently large
19710 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67  r than nPage pag
19720 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65  es, then use the
19730 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74   VFS.** xTruncat
19740 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72  e() method to tr
19750 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  uncate it..**.**
19760 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69   Or, it might mi
19770 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
19780 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e  that the file on
19790 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72   disk is smaller
197a0 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20   than .** nPage 
197b0 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72  pages. Some oper
197c0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
197d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
197e0 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
197f0 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20   .** you try to 
19800 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
19810 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
19820 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
19830 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   it .** currentl
19840 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20  y is, so detect 
19850 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72  this case and wr
19860 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72  ite a single zer
19870 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68  o byte to .** th
19880 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77  e end of the new
19890 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a   file instead..*
198a0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
198b0 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ul, return SQLIT
198c0 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65  E_OK. If an IO e
198d0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
198e0 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74  e modifying.** t
198f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19900 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
19910 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
19920 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
19930 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
19940 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
19950 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
19960 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19970 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
19980 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
19990 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
199a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
199b0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52  >eState!=PAGER_R
199c0 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66  EADER );.  .  if
199d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
199e0 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61  >fd) .   && (pPa
199f0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
19a00 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
19a10 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
19a20 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a  e==PAGER_OPEN) .
19a30 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72    ){.    i64 cur
19a40 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
19a50 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  e;.    int szPag
19a60 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
19a70 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Size;.    assert
19a80 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
19a90 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
19aa0 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  );.    /* TODO: 
19ab0 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73  Is it safe to us
19ac0 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
19ad0 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20  ze here? */.    
19ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
19af0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
19b00 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
19b10 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
19b20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67  szPage*(i64)nPag
19b30 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
19b40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
19b50 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
19b60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
19b70 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
19b80 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
19b90 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
19ba0 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
19bb0 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
19bc0 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72 65  }else if( (curre
19bd0 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d  ntSize+szPage)<=
19be0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
19bf0 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20     char *pTmp = 
19c00 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
19c10 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e;.        memse
19c20 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67  t(pTmp, 0, szPag
19c30 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
19c40 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
19c50 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e  zPage) == curren
19c60 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
19c70 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
19c80 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63  ize-szPage) >  c
19c90 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
19ca0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19cb0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
19cc0 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61  ->fd, pTmp, szPa
19cd0 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61  ge, newSize-szPa
19ce0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
19cf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19d00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19d10 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
19d20 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
19d30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
19d40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19d50 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e  .** Return a san
19d60 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  itized version o
19d70 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  f the sector-siz
19d80 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69  e of OS file pFi
19d90 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  le. The.** retur
19da0 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72 61  n value is guara
19db0 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74  nteed to lie bet
19dc0 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f  ween 32 and MAX_
19dd0 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a  SECTOR_SIZE..*/.
19de0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f  int sqlite3Secto
19df0 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
19e00 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
19e10 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33  t iRet = sqlite3
19e20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69  OsSectorSize(pFi
19e30 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c  le);.  if( iRet<
19e40 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d  32 ){.    iRet =
19e50 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66   512;.  }else if
19e60 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f  ( iRet>MAX_SECTO
19e70 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
19e80 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
19e90 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
19ea0 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43    iRet = MAX_SEC
19eb0 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20  TOR_SIZE;.  }.  
19ec0 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a  return iRet;.}..
19ed0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
19ee0 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
19ef0 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
19f00 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
19f10 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
19f20 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
19f30 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
19f40 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
19f50 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
19f60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19f70 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
19f80 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65  will be used use
19f90 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
19fa0 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
19fb0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
19fc0 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
19fd0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
19fe0 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
19ff0 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
1a000 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
1a010 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
1a020 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
1a030 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1a040 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1a050 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
1a060 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
1a070 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
1a080 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a090 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
1a0a0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1a0b0 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
1a0c0 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
1a0d0 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
1a0e0 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
1a0f0 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
1a100 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
1a110 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
1a120 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
1a130 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
1a140 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ZE..**.** If the
1a150 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51   file has the SQ
1a160 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1a170 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70  SAFE_OVERWRITE p
1a180 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65  roperty, then se
1a190 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69  t.** the effecti
1a1a0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74  ve sector size t
1a1b0 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61  o its minimum va
1a1c0 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20  lue (512).  The 
1a1d0 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50  purpose of.** pP
1a1e0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1a1f0 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68   is to define th
1a200 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22  e "blast radius"
1a210 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a   of bytes that.*
1a220 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69  * might change i
1a230 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
1a240 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
1a250 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  o a single byte 
1a260 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65  in.** that range
1a270 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45  .  But with POWE
1a280 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c  RSAFE_OVERWRITE,
1a290 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75   the blast radiu
1a2a0 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68  s is zero.** (th
1a2b0 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52  at is what POWER
1a2c0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d  SAFE_OVERWRITE m
1a2d0 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e  eans), so we min
1a2e0 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72  imize the sector
1a2f0 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62  .** size.  For b
1a300 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
1a310 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f  bility of the ro
1a320 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
1a330 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77  ile format,.** w
1a340 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20  e cannot reduce 
1a350 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a360 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20  ctor size below 
1a370 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  512..*/.static v
1a380 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
1a390 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1a3a0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  {.  assert( isOp
1a3b0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1a3c0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1a3d0 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  le );..  if( pPa
1a3e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20  ger->tempFile.  
1a3f0 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
1a400 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1a410 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ics(pPager->fd) 
1a420 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  & .             
1a430 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1a440 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a450 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  E)!=0.  ){.    /
1a460 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
1a470 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
1a480 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1a490 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
1a4a0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
1a4b0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
1a4c0 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
1a4d0 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
1a4e0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
1a4f0 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
1a500 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
1a510 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31  >sectorSize = 51
1a520 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
1a530 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1a540 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74  ze = sqlite3Sect
1a550 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
1a560 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
1a570 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
1a580 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
1a590 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
1a5a0 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
1a5b0 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
1a5c0 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
1a5d0 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
1a5e0 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
1a5f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1a600 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
1a610 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
1a620 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
1a630 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
1a640 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
1a650 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
1a660 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1a670 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1a680 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
1a690 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
1a6a0 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
1a6b0 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
1a6c0 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
1a6d0 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
1a6e0 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
1a6f0 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
1a700 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1a710 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
1a720 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1a730 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1a740 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1a750 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
1a760 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
1a770 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
1a780 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
1a790 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
1a7a0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
1a7b0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
1a7c0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
1a7d0 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
1a7e0 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
1a7f0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1a800 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1a810 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
1a820 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
1a830 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
1a840 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
1a850 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
1a860 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1a870 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1a880 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
1a890 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64  *  (7)  zero pad
1a8a0 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20  ding out to the 
1a8b0 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65  next sector size
1a8c0 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20  ..**  (8)  Zero 
1a8d0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
1a8e0 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
1a8f0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
1a900 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
1a910 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
1a920 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
1a930 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
1a940 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
1a950 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
1a960 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
1a970 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
1a980 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
1a990 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
1a9a0 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 7 items above.
1a9b0 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
1a9c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1a9d0 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1a9e0 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 8th item..**
1a9f0 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
1aa00 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
1aa10 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
1aa20 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
1aa30 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
1aa40 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
1aa50 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1aa60 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
1aa70 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
1aa80 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
1aa90 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
1aaa0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1aab0 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
1aac0 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
1aad0 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
1aae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1aaf0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1ab00 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
1ab10 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
1ab20 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1ab30 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
1ab40 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1ab50 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
1ab60 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
1ab70 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
1ab80 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
1ab90 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
1aba0 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
1abb0 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
1abc0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
1abd0 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
1abe0 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
1abf0 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
1ac00 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
1ac10 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
1ac20 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
1ac30 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
1ac40 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
1ac50 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
1ac60 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
1ac70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
1ac80 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
1ac90 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
1aca0 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
1acb0 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
1acc0 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
1acd0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
1ace0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
1acf0 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
1ad00 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
1ad10 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
1ad20 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
1ad30 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
1ad40 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
1ad50 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
1ad60 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
1ad70 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
1ad80 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
1ad90 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
1ada0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1adb0 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
1adc0 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
1add0 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
1ade0 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
1adf0 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
1ae00 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
1ae10 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
1ae20 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
1ae30 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
1ae40 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
1ae50 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
1ae60 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
1ae70 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1ae80 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
1ae90 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
1aea0 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
1aeb0 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
1aec0 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
1aed0 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
1aee0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
1aef0 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
1af00 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
1af10 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1af20 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
1af30 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
1af40 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
1af50 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
1af60 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
1af70 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
1af80 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
1af90 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
1afa0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1afb0 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
1afc0 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
1afd0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
1afe0 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
1aff0 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
1b000 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
1b010 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
1b020 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
1b030 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
1b040 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
1b050 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
1b060 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
1b070 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
1b080 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
1b090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b0a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
1b0b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1b0c0 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
1b0d0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
1b0e0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
1b0f0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
1b100 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b110 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b120 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
1b130 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
1b140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b150 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
1b160 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1b170 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b190 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
1b1a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
1b1b0 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
1b1c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b1d0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
1b1e0 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
1b1f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1b200 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1b210 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
1b220 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b230 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
1b240 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
1b250 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
1b260 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
1b270 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
1b280 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
1b290 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
1b2a0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
1b2b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
1b2c0 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
1b2d0 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
1b2e0 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
1b2f0 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
1b300 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79  k */.  int nPlay
1b310 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  back = 0;       
1b320 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
1b330 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f 72 65  of pages restore
1b340 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
1b350 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
1b360 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
1b370 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
1b380 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
1b390 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
1b3a0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
1b3b0 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
1b3c0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1b3d0 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20  >jfd) );.  rc = 
1b3e0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1b3f0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1b400 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
1b410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b420 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b430 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
1b440 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
1b450 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
1b460 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
1b470 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
1b480 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
1b490 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1b4a0 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
1b4b0 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
1b4c0 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
1b4d0 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
1b4e0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
1b4f0 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
1b500 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
1b510 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
1b520 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
1b530 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  Technically the 
1b540 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20  following is an 
1b550 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74  error because it
1b560 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20   assumes that.  
1b570 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e  ** buffer Pager.
1b580 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78  pTmpSpace is (mx
1b590 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65  Pathname+1) byte
1b5a0 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65  s or larger. i.e
1b5b0 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61  . that.  ** (pPa
1b5c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d  ger->pageSize >=
1b5d0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1b5e0 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73  xPathname+1). Us
1b5f0 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20  ing os_unix.c,. 
1b600 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20   **  mxPathname 
1b610 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73  is 512, which is
1b620 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1b630 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62   minimum allowab
1b640 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f  le value.  ** fo
1b650 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f  r pageSize..  */
1b660 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
1b670 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1b680 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1b690 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1b6a0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1b6b0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1b6c0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66  athname+1);.  if
1b6d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b6e0 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b  && zMaster[0] ){
1b6f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b700 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1b710 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
1b720 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1b730 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  res);.  }.  zMas
1b740 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ter = 0;.  if( r
1b750 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1b760 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !res ){.    goto
1b770 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1b780 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
1b790 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e  rnalOff = 0;.  n
1b7a0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1b7b0 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69  isHot;..  /* Thi
1b7c0 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
1b7d0 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20  s either when a 
1b7e0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
1b7f0 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f   or .  ** pager_
1b800 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1b810 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  e() call returns
1b820 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
1b830 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a  an IO error .  *
1b840 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a  * occurs. .  */.
1b850 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1b860 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
1b870 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
1b880 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
1b890 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
1b8a0 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
1b8b0 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
1b8c0 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
1b8d0 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
1b8e0 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
1b8f0 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
1b900 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
1b910 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61   process must ha
1b920 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ve failed while 
1b930 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
1b940 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
1b950 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
1b960 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
1b970 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
1b980 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
1b990 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69  nalHdr(pPager, i
1b9a0 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  sHot, szJ, &nRec
1b9b0 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
1b9c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b9d0 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
1b9e0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1b9f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ba00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1ba10 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
1ba20 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
1ba30 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1ba40 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1ba50 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
1ba60 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1ba70 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
1ba80 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
1ba90 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
1baa0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
1bab0 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
1bac0 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
1bad0 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
1bae0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
1baf0 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
1bb00 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
1bb10 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1bb20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
1bb30 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
1bb40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1bb50 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
1bb60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bb70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1bb80 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1bb90 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
1bba0 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
1bbb0 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f  ((szJ - JOURNAL_
1bbc0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
1bbd0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1bbe0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1bbf0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1bc00 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
1bc10 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
1bc20 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
1bc30 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
1bc40 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
1bc50 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
1bc60 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
1bc70 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
1bc80 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
1bc90 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
1bca0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1bcb0 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
1bcc0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1bcd0 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
1bce0 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
1bcf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1bd00 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
1bd10 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
1bd20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
1bd30 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1bd40 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
1bd50 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
1bd60 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
1bd70 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
1bd80 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67   ** When rolling
1bd90 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72   back a hot jour
1bda0 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77  nal, nRec==0 alw
1bdb0 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ays means that t
1bdc0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63  he next.    ** c
1bdd0 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  hunk of the jour
1bde0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  nal contains zer
1bdf0 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f  o pages to be ro
1be00 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a  lled back.  But.
1be10 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e      ** when doin
1be20 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  g a ROLLBACK and
1be30 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75   the nRec==0 chu
1be40 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  nk is the last c
1be50 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74  hunk in.    ** t
1be60 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d  he journal, it m
1be70 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f  eans that the jo
1be80 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
1be90 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20  ain additional. 
1bea0 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74     ** pages that
1beb0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c   need to be roll
1bec0 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ed back and that
1bed0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1bee0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f  ages .    ** sho
1bef0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
1bf00 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  based on the jou
1bf10 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a  rnal file size..
1bf20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1bf30 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
1bf40 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
1bf50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
1bf60 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1bf70 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
1bf80 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
1bf90 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1bfa0 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
1bfb0 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
1bfc0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1bfd0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1bfe0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1bff0 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
1c000 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
1c010 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
1c020 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
1c030 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
1c040 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
1c050 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1c060 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1c070 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1c080 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
1c090 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1c0a0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
1c0b0 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
1c0c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c0d0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1c0e0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c0f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1c100 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
1c110 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  Pg;.    }..    /
1c120 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
1c130 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
1c140 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
1c150 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  k into the .    
1c160 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1c170 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63   and/or page cac
1c180 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  he..    */.    f
1c190 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
1c1a0 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  u++){.      if( 
1c1b0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29  needPagerReset )
1c1c0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
1c1d0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1c1e0 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72         needPager
1c1f0 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  Reset = 0;.     
1c200 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61   }.      rc = pa
1c210 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1c220 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50  _page(pPager,&pP
1c230 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c240 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69  ,0,1,0);.      i
1c250 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c260 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61   ){.        nPla
1c270 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d  yback++;.      }
1c280 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1c290 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1c2a0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  E ){.          p
1c2b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c2c0 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
1c2d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c2e0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1c2f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1c300 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1c310 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
1c320 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
1c330 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c  truncated, simpl
1c340 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61  y stop reading a
1c350 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
1c360 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a  processing the j
1c370 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67  ournal. This mig
1c380 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ht happen if the
1c390 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
1c3a0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f         ** not co
1c3b0 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e  mpletely written
1c3c0 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f   and synced prio
1c3d0 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49  r to a crash.  I
1c3e0 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
1c3f0 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61   ** case, the da
1c400 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61  tabase should ha
1c410 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ve never been wr
1c420 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20  itten in the.   
1c430 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
1c440 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f  place so it is O
1c450 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e  K to simply aban
1c460 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  don the rollback
1c470 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1c480 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c490 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1c4a0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1c4b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c4c0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
1c4d0 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  e unable to roll
1c4e0 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72  back, quit and r
1c4f0 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a  eturn the error.
1c500 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64            ** cod
1c510 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
1c520 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f  use the pager to
1c530 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
1c540 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20   state.         
1c550 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66   ** so that no f
1c560 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c  urther harm will
1c570 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61   be done.  Perha
1c580 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  ps the next.    
1c590 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1c5a0 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77   to come along w
1c5b0 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72  ill be able to r
1c5c0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61  ollback the data
1c5d0 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  base..          
1c5e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
1c5f0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1c600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c610 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
1c620 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
1c630 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
1c640 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20  _playback:.  /* 
1c650 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c  Following a roll
1c660 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
1c670 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1c680 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72  e back in its or
1c690 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74  iginal.  ** stat
1c6a0 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  e prior to the s
1c6b0 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
1c6c0 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f  saction, so invo
1c6d0 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ke the.  ** SQLI
1c6e0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1c6f0 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  ANGED file-contr
1c700 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73  ol method to dis
1c710 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73  able the.  ** as
1c720 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65  sertion that the
1c730 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1c740 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65  nter was modifie
1c750 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  d..  */.#ifdef S
1c760 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1c770 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
1c780 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71  ethods ){.    sq
1c790 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
1c7a0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
1c7b0 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  d,SQLITE_FCNTL_D
1c7c0 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a  B_UNCHANGED,0);.
1c7d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1c7e0 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63   If this playbac
1c7f0 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  k is happening a
1c800 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20  utomatically as 
1c810 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49  a result of an I
1c820 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  O or .  ** mallo
1c830 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  c error that occ
1c840 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20  urred after the 
1c850 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
1c860 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
1c870 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
1c880 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1c890 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
1c8a0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1c8b0 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
1c8c0 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
1c8d0 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
1c8e0 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
1c8f0 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
1c900 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
1c910 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
1c920 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
1c930 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
1c940 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
1c950 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
1c960 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1c970 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
1c980 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
1c990 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
1c9a0 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
1c9b0 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
1c9c0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
1c9d0 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
1c9e0 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
1c9f0 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
1ca00 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
1ca10 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
1ca20 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
1ca30 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1ca40 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
1ca50 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
1ca60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ca70 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
1ca80 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1ca90 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
1caa0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1cab0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1cac0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1cad0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1cae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1caf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1cb00 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1cb10 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50  ITE_OK.   && (pP
1cb20 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1cb30 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
1cb40 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1cb50 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
1cb60 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
1cb70 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70  lite3PagerSync(p
1cb80 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
1cb90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cba0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
1cbb0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
1cbc0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
1cbd0 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30  ster[0]!='\0', 0
1cbe0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1cbf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cc00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1cc10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1cc20 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
1cc30 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1cc40 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
1cc50 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
1cc60 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
1cc70 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
1cc80 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
1cc90 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
1cca0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
1ccb0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
1ccc0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
1ccd0 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
1cce0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65  zMaster);.    te
1ccf0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1cd00 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1cd10 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61  f( isHot && nPla
1cd20 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  yback ){.    sql
1cd30 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
1cd40 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
1cd50 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65  OLLBACK, "recove
1cd60 72 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f  red %d pages fro
1cd70 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  m %s",.         
1cd80 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b         nPlayback
1cd90 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1cda0 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  al);.  }..  /* T
1cdb0 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1cdc0 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
1cdd0 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
1cde0 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
1cdf0 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
1ce00 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
1ce10 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
1ce20 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
1ce30 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
1ce40 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
1ce50 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
1ce60 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
1ce70 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63  s..  */.  setSec
1ce80 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
1ce90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cea0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1ceb0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
1cec0 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
1ced0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1cee0 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  nd into .** pPg-
1cef0 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
1cf00 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
1cf10 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
1cf20 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1cf30 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
1cf40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1cf50 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
1cf60 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
1cf70 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
1cf80 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
1cf90 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
1cfa0 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
1cfb0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1cfc0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1cfd0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1cfe0 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
1cff0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1d000 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
1d010 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
1d020 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1d030 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1d040 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
1d050 50 67 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20  PgHdr *pPg, u32 
1d060 69 46 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72  iFrame){.  Pager
1d070 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1d080 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
1d090 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
1d0a0 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
1d0b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
1d0c0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
1d0d0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1d0e0 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
1d0f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d100 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
1d110 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1d120 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65  int pgsz = pPage
1d130 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20  r->pageSize; /* 
1d140 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1d150 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  to read */..  as
1d160 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1d170 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
1d180 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  ER && !MEMDB );.
1d190 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1d1a0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
1d1b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d1c0 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69  OMIT_WAL.  if( i
1d1d0 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Frame ){.    /* 
1d1e0 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20  Try to pull the 
1d1f0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72  page from the wr
1d200 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a  ite-ahead log. *
1d210 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1d220 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70  e3WalReadFrame(p
1d230 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72  Pager->pWal, iFr
1d240 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e  ame, pgsz, pPg->
1d250 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a  pData);.  }else.
1d260 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69  #endif.  {.    i
1d270 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67  64 iOffset = (pg
1d280 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
1d290 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1d2a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1d2b0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1d2c0 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a  pPg->pData, pgsz
1d2d0 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
1d2e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1d2f0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1d300 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1d310 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1d320 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   }..  if( pgno==
1d330 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20  1 ){.    if( rc 
1d340 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1d350 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63  he read is unsuc
1d360 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
1d370 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f   dbFileVers[] to
1d380 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20   something.     
1d390 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65   ** that will ne
1d3a0 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66  ver be a valid f
1d3b0 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62  ile version.  db
1d3c0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20  FileVers[] is a 
1d3d0 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66  copy.      ** of
1d3e0 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66   bytes 24..39 of
1d3f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1d400 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f  Bytes 28..31 sho
1d410 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20  uld always be.  
1d420 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74      ** zero or t
1d430 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1d440 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e  atabase in page.
1d450 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e   Bytes 32..35 an
1d460 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a  d 35..39.      *
1d470 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65  * should be page
1d480 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
1d490 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66  re never 0xfffff
1d4a0 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67  fff.  So filling
1d4b0 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72  .      ** pPager
1d4c0 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77  ->dbFileVers[] w
1d4d0 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74  ith all 0xff byt
1d4e0 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63  es should suffic
1d4f0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
1d500 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72    ** For an encr
1d510 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20  ypted database, 
1d520 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73  the situation is
1d530 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20   more complex:  
1d540 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32  bytes.      ** 2
1d550 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1d560 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20  abase are white 
1d570 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20  noise.  But the 
1d580 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20  probability of. 
1d590 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f       ** white no
1d5a0 69 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31  ising equaling 1
1d5b0 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20  6 bytes of 0xff 
1d5c0 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73  is vanishingly s
1d5d0 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a  mall so.      **
1d5e0 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c   we should still
1d5f0 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f   be ok..      */
1d600 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
1d610 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d620 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70  , 0xff, sizeof(p
1d630 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d640 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s));.    }else{.
1d650 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65        u8 *dbFile
1d660 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50  Vers = &((u8*)pP
1d670 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20  g->pData)[24];. 
1d680 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1d690 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1d6a0 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
1d6b0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1d6c0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
1d6d0 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
1d6e0 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
1d6f0 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53   pgno, 3, rc = S
1d700 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20  QLITE_NOMEM);.. 
1d710 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1d720 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1d730 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
1d740 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
1d750 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
1d760 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
1d770 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1d780 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
1d790 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
1d7a0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1d7c0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1d7d0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1d7e0 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
1d7f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d800 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76  .** Update the v
1d810 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e  alue of the chan
1d820 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66  ge-counter at of
1d830 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20  fsets 24 and 92 
1d840 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  in.** the header
1d850 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20   and the sqlite 
1d860 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61  version number a
1d870 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a  t offset 96..**.
1d880 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e  ** This is an un
1d890 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61  conditional upda
1d8a0 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68  te.  See also th
1d8b0 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  e pager_incr_cha
1d8c0 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20  ngecounter().** 
1d8d0 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e  routine which on
1d8e0 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1d8f0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66  hange-counter if
1d900 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61   the update is a
1d910 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65  ctually.** neede
1d920 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64  d, as determined
1d930 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e   by the pPager->
1d940 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1d950 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a  state variable..
1d960 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1d970 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1d980 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a  ecounter(PgHdr *
1d990 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e  pPg){.  u32 chan
1d9a0 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f  ge_counter;..  /
1d9b0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1d9c0 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1d9d0 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1d9e0 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1d9f0 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
1da00 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
1da10 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50  yte((u8*)pPg->pP
1da20 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1da30 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73  )+1;.  put32bits
1da40 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1da50 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  ata)+24, change_
1da60 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  counter);..  /* 
1da70 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
1da80 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
1da90 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
1daa0 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a  ..99 and in.  **
1dab0 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74   bytes 92..95 st
1dac0 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ore the change c
1dad0 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68  ounter for which
1dae0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
1daf0 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69  ber.  ** is vali
1db00 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  d. */.  put32bit
1db10 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1db20 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65  Data)+92, change
1db30 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74  _counter);.  put
1db40 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1db50 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53  Pg->pData)+96, S
1db60 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
1db70 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  MBER);.}..#ifnde
1db80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1db90 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  L./*.** This fun
1dba0 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
1dbb0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
1dbc0 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  age that has alr
1dbd0 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72  eady been .** wr
1dbe0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c  itten into the l
1dbf0 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57  og file when a W
1dc00 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1dc10 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1dc20 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20  * Parameter iPg 
1dc30 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
1dc40 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e  er of said page.
1dc50 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65   The pCtx argume
1dc60 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c  nt .** is actual
1dc70 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
1dc80 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1dc90 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ure..**.** If pa
1dca0 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e  ge iPg is presen
1dcb0 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  t in the cache, 
1dcc0 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  and has no outst
1dcd0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
1dce0 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63  s,.** it is disc
1dcf0 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65  arded. Otherwise
1dd00 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  , if there are o
1dd10 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
1dd20 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65  anding.** refere
1dd30 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63  nces, the page c
1dd40 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64  ontent is reload
1dd50 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1dd60 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  base. If the.** 
1dd70 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61  attempt to reloa
1dd80 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
1dd90 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72  he database is r
1dda0 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c  equired and fail
1ddb0 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e  s, .** return an
1ddc0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1ddd0 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
1dde0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
1ddf0 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64  tic int pagerUnd
1de00 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  oCallback(void *
1de10 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b  pCtx, Pgno iPg){
1de20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1de30 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1de40 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
1de50 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20  *)pCtx;.  PgHdr 
1de60 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
1de70 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1de80 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20  ger) );.  pPg = 
1de90 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1dea0 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
1deb0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
1dec0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
1ded0 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
1dee0 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
1def0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
1df00 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
1df10 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46  se{.      u32 iF
1df20 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rame = 0;.      
1df30 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1df40 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
1df50 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  >pWal, pPg->pgno
1df60 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
1df70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1df80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1df90 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1dfa0 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20  Pg, iFrame);.   
1dfb0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1dfc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1dfd0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1dfe0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1dff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1e000 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
1e010 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20  otNull(pPg);.   
1e020 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
1e030 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
1e040 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1e050 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
1e060 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
1e070 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
1e080 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
1e090 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
1e0a0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1e0b0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
1e0c0 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1e0d0 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1e0e0 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1e0f0 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1e100 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1e110 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1e120 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1e130 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1e140 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1e150 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1e160 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1e170 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1e180 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1e190 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1e1a0 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1e1b0 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1e1c0 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1e1d0 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1e1e0 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1e1f0 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1e200 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1e210 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1e220 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1e230 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e240 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e250 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1e260 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1e270 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1e280 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1e290 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1e2a0 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1e2b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e2e0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1e2f0 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e310 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1e320 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1e330 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1e340 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1e350 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1e360 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1e370 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1e380 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1e390 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1e3a0 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1e3b0 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1e3c0 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1e3d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1e3e0 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1e3f0 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1e400 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1e410 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1e420 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1e430 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1e440 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1e450 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1e460 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1e470 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1e480 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1e490 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1e4a0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1e4b0 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1e4c0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1e4d0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1e4e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1e4f0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
1e500 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
1e510 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  OK ){.    PgHdr 
1e520 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
1e530 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d  pDirty;.    rc =
1e540 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1e550 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65  ck((void *)pPage
1e560 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  r, pList->pgno);
1e570 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
1e580 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  xt;.  }..  retur
1e590 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1e5a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e5b0 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
1e5c0 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1e5d0 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  s(). As well as 
1e5e0 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63  logging.** the c
1e5f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  ontents of the l
1e600 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61  ist of pages hea
1e610 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f  ded by pList (co
1e620 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
1e630 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  y),.** this func
1e640 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e  tion notifies an
1e650 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20  y active backup 
1e660 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74  processes that t
1e670 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  he pages have.**
1e680 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a   changed. .**.**
1e690 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   The list of pag
1e6a0 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  es passed into t
1e6b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1e6c0 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20  lways sorted by 
1e6d0 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1e6e0 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31  Hence, if page 1
1e6f0 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72   appears anywher
1e700 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69  e on the list, i
1e710 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69  t will be the fi
1e720 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74  rst page..*/ .st
1e730 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61  atic int pagerWa
1e740 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72  lFrames(.  Pager
1e750 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
1e760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1e770 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1e780 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20  PgHdr *pList,   
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65  /* List of frame
1e7b0 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67  s to log */.  Pg
1e7c0 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20  no nTruncate,   
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e7e0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   Database size a
1e7f0 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74  fter this commit
1e800 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1e810 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1e820 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e830 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
1e840 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1e850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e870 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1e880 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20  t nList;        
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e8a0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1e8b0 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 23 69 66   in pList */.#if
1e8c0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1e8d0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1e8e0 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  d(SQLITE_CHECK_P
1e8f0 41 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a 70  AGES).  PgHdr *p
1e900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e910 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1e920 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1e930 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  s */.#endif..  a
1e940 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1e950 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Wal );.  assert(
1e960 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66   pList );.#ifdef
1e970 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1e980 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1e990 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20  he page list is 
1e9a0 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
1e9b0 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c  er */.  for(p=pL
1e9c0 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69  ist; p && p->pDi
1e9d0 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  rty; p=p->pDirty
1e9e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1e9f0 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72  ->pgno < p->pDir
1ea00 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a  ty->pgno );.  }.
1ea10 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1ea20 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  ( pList->pDirty=
1ea30 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29  =0 || isCommit )
1ea40 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74  ;.  if( isCommit
1ea50 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1ea60 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1ea70 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
1ea80 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
1ea90 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67  point in writing
1eaa0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65  .    ** any page
1eab0 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
1eac0 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
1ead0 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20   nTruncate into 
1eae0 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20  the WAL file..  
1eaf0 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e    ** They will n
1eb00 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20  ever be read by 
1eb10 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72  any client. So r
1eb20 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
1eb30 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a  the pDirty.    *
1eb40 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a  * list here. */.
1eb50 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1eb60 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74    PgHdr **ppNext
1eb70 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e   = &pList;.    n
1eb80 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  List = 0;.    fo
1eb90 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e  r(p=pList; (*ppN
1eba0 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70  ext = p)!=0; p=p
1ebb0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1ebc0 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54   if( p->pgno<=nT
1ebd0 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1ebe0 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e     ppNext = &p->
1ebf0 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20  pDirty;.        
1ec00 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  nList++;.      }
1ec10 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1ec20 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65  t( pList );.  }e
1ec30 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  lse{.    nList =
1ec40 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   1;.  }.  pPager
1ec50 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
1ec60 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69  AT_WRITE] += nLi
1ec70 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  st;..  if( pList
1ec80 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
1ec90 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1eca0 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
1ecb0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1ecc0 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1ecd0 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1ece0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1ecf0 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1ed00 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d  sCommit, pPager-
1ed10 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20  >walSyncFlags.  
1ed20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1ed30 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1ed40 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
1ed50 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
1ed60 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1ed70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1ed80 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
1ed90 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
1eda0 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c  Backup, p->pgno,
1edb0 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29   (u8 *)p->pData)
1edc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
1edd0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1ede0 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d  _PAGES.  pList =
1edf0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
1ee00 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
1ee10 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28  pPCache);.  for(
1ee20 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1ee30 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61  >pDirty){.    pa
1ee40 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
1ee50 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (p);.  }.#endif.
1ee60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ee70 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72  ./*.** Begin a r
1ee80 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
1ee90 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a  on the WAL..**.*
1eea0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
1eeb0 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  sed to be called
1eec0 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73   "pagerOpenSnaps
1eed0 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69  hot()" because i
1eee0 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a  t essentially.**
1eef0 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f   makes a snapsho
1ef00 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1ef10 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  e at the current
1ef20 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61   point in time a
1ef30 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20  nd preserves.** 
1ef40 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f  that snapshot fo
1ef50 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61  r use by the rea
1ef60 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20  der in spite of 
1ef70 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61  concurrently cha
1ef80 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72  nges by.** other
1ef90 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63   writers or chec
1efa0 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74  kpointers..*/.st
1efb0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65  atic int pagerBe
1efc0 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1efd0 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
1efe0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1f010 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61  ode */.  int cha
1f020 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  nged = 0;       
1f030 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f040 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62   if cache must b
1f050 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73  e reset */..  as
1f060 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1f070 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  l(pPager) );.  a
1f080 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f090 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1f0a0 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
1f0b0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
1f0c0 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  R );..  /* sqlit
1f0d0 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
1f0e0 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f  saction() was no
1f0f0 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  t called for the
1f100 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74   previous.  ** t
1f110 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f  ransaction in lo
1f120 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
1f130 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69  SIVE.  So call i
1f140 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20  t now.  If we.  
1f150 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e  ** are in lockin
1f160 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e  g_mode=NORMAL an
1f170 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20  d EndRead() was 
1f180 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
1f190 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c  d,.  ** the dupl
1f1a0 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61  icate call is ha
1f1b0 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rmless..  */.  s
1f1c0 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1f1d0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1f1e0 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63  er->pWal);..  rc
1f1f0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
1f200 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1f210 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  n(pPager->pWal, 
1f220 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28  &changed);.  if(
1f230 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1f240 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  | changed ){.   
1f250 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1f260 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53  ger);.    if( US
1f270 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
1f280 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
1f290 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c  h(pPager->fd, 0,
1f2a0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   0);.  }..  retu
1f2b0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1f2c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f2d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
1f2e0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72  s part of the tr
1f2f0 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41  ansition from PA
1f300 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50  GER_OPEN.** to P
1f310 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
1f320 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
1f330 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1f340 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1f350 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69  in pages (assumi
1f360 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ng the page size
1f370 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1f380 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53  d in Pager.pageS
1f390 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ize)..**.** If n
1f3a0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1f3b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1f3c0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69  urned and the si
1f3d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1f3e0 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69  se.** in pages i
1f3f0 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50  s stored in *pnP
1f400 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
1f410 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70  an error code (p
1f420 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45  erhaps.** SQLITE
1f430 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73  _IOERR_FSTAT) is
1f440 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1f450 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
1f460 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
1f470 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
1f480 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
1f490 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61  ager, Pgno *pnPa
1f4a0 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1f4b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1f4c0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1f4d0 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
1f4e0 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51  nPage */..  /* Q
1f4f0 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62  uery the WAL sub
1f500 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
1f510 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54  database size. T
1f520 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20  he WalDbsize(). 
1f530 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74   ** function ret
1f540 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65  urns zero if the
1f550 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e   WAL is not open
1f560 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61   (i.e. Pager.pWa
1f570 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69  l==0), or.  ** i
1f580 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1f590 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ize is not avail
1f5a0 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61  able. The databa
1f5b0 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20  se size is not. 
1f5c0 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72   ** available fr
1f5d0 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1f5e0 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67  ystem if the log
1f5f0 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f   file is empty o
1f600 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  r.  ** contains 
1f610 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74  no valid committ
1f620 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
1f630 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f640 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1f650 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
1f660 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f670 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
1f680 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20  CK );.  nPage = 
1f690 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
1f6a0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1f6b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
1f6c0 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e  abase size was n
1f6d0 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ot available fro
1f6e0 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  m the WAL sub-sy
1f6f0 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72  stem,.  ** deter
1f700 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e  mine it based on
1f710 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f720 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1f730 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a  If the size.  **
1f740 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f750 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20   file is not an 
1f760 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
1f770 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
1f780 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f  e,.  ** round do
1f790 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73  wn to the neares
1f7a0 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20  t page. Except, 
1f7b0 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20  any file larger 
1f7c0 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65  than 0.  ** byte
1f7d0 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
1f7e0 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61  sidered to conta
1f7f0 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  in at least one 
1f800 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1f810 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1f820 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f840 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * Size of db fil
1f850 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1f860 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1f870 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1f880 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1f890 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
1f8a0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1f8b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
1f8c0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1f8d0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
1f8e0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
1f8f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f900 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f920 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1f930 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61  o)((n+pPager->pa
1f940 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67  geSize-1) / pPag
1f950 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1f960 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1f970 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
1f980 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1f990 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ile is greater t
1f9a0 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  han the.  ** con
1f9b0 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
1f9c0 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
1f9d0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
1f9e0 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
1f9f0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
1fa00 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
1fa10 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
1fa20 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1fa30 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
1fa40 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
1fa50 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20  .  }..  *pnPage 
1fa60 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1fa70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1fa80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fa90 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68  MIT_WAL./*.** Ch
1faa0 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c  eck if the *-wal
1fab0 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65   file that corre
1fac0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61  sponds to the da
1fad0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1fae0 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74   pPager.** exist
1faf0 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  s if the databas
1fb00 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f  e is not empy, o
1fb10 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  r verify that th
1fb20 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
1fb30 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28  s.** not exist (
1fb40 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20  by deleting it) 
1fb50 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1fb60 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  file is empty..*
1fb70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1fb80 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74  base is not empt
1fb90 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20  y and the *-wal 
1fba0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65  file exists, ope
1fbb0 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69  n the pager.** i
1fbc0 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20  n WAL mode.  If 
1fbd0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1fbe0 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a  empty or if no *
1fbf0 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
1fc00 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72   and.** if no er
1fc10 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  ror occurs, make
1fc20 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
1fc30 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
1fc40 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a  et to.** PAGER_J
1fc50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a  OURNALMODE_WAL..
1fc60 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1fc70 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72  ITE_OK or an err
1fc80 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
1fc90 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68  he caller must h
1fca0 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63  old a SHARED loc
1fcb0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1fcc0 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e file to call t
1fcd0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
1fce0 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c   Because an EXCL
1fcf0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1fd00 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71  e db file is req
1fd10 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20  uired to delete 
1fd20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e  .** a WAL on a n
1fd30 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61  one-empty databa
1fd40 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  se, this ensures
1fd50 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
1fd60 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  e condition .** 
1fd70 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63  between the xAcc
1fd80 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20  ess() below and 
1fd90 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
1fda0 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
1fdb0 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f  ome .** other co
1fdc0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1fdd0 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1fde0 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61  nWalIfPresent(Pa
1fdf0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1fe00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1fe10 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
1fe20 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1fe30 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1fe40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1fe50 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1fe60 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
1fe70 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1fe80 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20      int isWal;  
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c    /* True if WAL
1feb0 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
1fec0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fee0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1fef0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1ff00 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  /..    rc = page
1ff10 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1ff20 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1ff30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1ff40 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67  rc;.    if( nPag
1ff50 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
1ff60 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
1ff70 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
1ff80 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30   pPager->zWal, 0
1ff90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1ffa0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  =SQLITE_IOERR_DE
1ffb0 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20  LETE_NOENT ) rc 
1ffc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1ffd0 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20     isWal = 0;.  
1ffe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1fff0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
20000 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70  ess(.          p
20010 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
20020 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54  ger->zWal, SQLIT
20030 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
20040 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b   &isWal.      );
20050 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
20060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20070 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20        if( isWal 
20080 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
20090 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63  ase( sqlite3Pcac
200a0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
200b0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
200c0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
200d0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
200e0 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  Wal(pPager, 0);.
200f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20100 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20110 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
20120 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20  ALMODE_WAL ){.  
20130 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
20140 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
20150 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
20160 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LETE;.      }.  
20170 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20180 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
20190 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61  *.** Playback sa
201a0 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69  vepoint pSavepoi
201b0 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65  nt. Or, if pSave
201c0 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65  point==NULL, the
201d0 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68  n playback.** th
201e0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
201f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
20200 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e  e case pSavepoin
20210 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77  t==NULL occurs w
20220 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41  hen .** a ROLLBA
20230 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73  CK TO command is
20240 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41   invoked on a SA
20250 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20  VEPOINT that is 
20260 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
20270 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a  * savepoint..**.
20280 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69  ** When pSavepoi
20290 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28  nt is not NULL (
202a0 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72  meaning a non-tr
202b0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
202c0 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67  int is .** being
202d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74   rolled back), t
202e0 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
202f0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20   consists of up 
20300 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c  to three stages,
20310 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e  .** performed in
20320 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69   the order speci
20330 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  fied:.**.**   * 
20340 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  Pages are played
20350 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
20360 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
20370 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20  ting at byte.** 
20380 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72      offset Pager
20390 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
203a0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
203b0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65   to .**     Page
203c0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
203d0 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65  ffset, or to the
203e0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
203f0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
20400 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76  file if PagerSav
20410 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20420 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  t is zero..**.**
20430 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76     * If PagerSav
20440 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20450 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
20460 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c  hen pages are pl
20470 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b  ayed.**     back
20480 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74   starting from t
20490 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
204a0 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  r immediately fo
204b0 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20  llowing .**     
204c0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
204d0 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65  HdrOffset to the
204e0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
204f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
20500 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
20510 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62  re then played b
20520 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ack from the sub
20530 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73  -journal file, s
20540 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77  tarting.**     w
20550 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76  ith the PagerSav
20560 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61  epoint.iSubRec a
20570 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
20580 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20   the end of.**  
20590 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
205a0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75  ile..**.** Throu
205b0 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61  ghout the rollba
205c0 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68  ck process, each
205d0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
205e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
205f0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
20600 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
20610 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  a bitvec structu
20620 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f  re (variable pDo
20630 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70  ne in the.** imp
20640 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f  lementation belo
20650 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  w). This is used
20660 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
20670 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a  a page is only.*
20680 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  * rolled back th
20690 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20  e first time it 
206a0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
206b0 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c  n either journal
206c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65  ..**.** If pSave
206d0 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  point is NULL, t
206e0 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e  hen pages are on
206f0 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  ly played back f
20700 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  rom the main.** 
20710 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
20720 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
20730 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74  or a bitvec in t
20740 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
20750 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
20760 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20  before playback 
20770 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61  commences the Pa
20780 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61  ger.dbSize varia
20790 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20  ble.** is reset 
207a0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  to the value tha
207b0 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65  t it held at the
207c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61   start of the sa
207d0 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20  vepoint .** (or 
207e0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f  transaction). No
207f0 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67   page with a pag
20800 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e-number greater
20810 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
20820 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61  .** is played ba
20830 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e  ck. If one is en
20840 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
20850 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a  simply skipped..
20860 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20870 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
20880 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
20890 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69  er, PagerSavepoi
208a0 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b  nt *pSavepoint){
208b0 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
208c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
208d0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
208e0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
208f0 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  l */.  i64 iHdrO
20900 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
20910 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20  /* End of first 
20920 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d  segment of main-
20930 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
20940 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
20950 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
20960 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
20970 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20    Bitvec *pDone 
20980 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69  = 0;       /* Bi
20990 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70  tvec to ensure p
209a0 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b  ages played back
209b0 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20   only once */.. 
209c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
209d0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
209e0 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
209f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20a00 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
20a10 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41  OCKED );..  /* A
20a20 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
20a30 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
20a40 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
20a50 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
20a60 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20a70 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
20a80 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
20a90 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
20aa0 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
20ab0 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
20ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
20ad0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
20ae0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61  .  /* Set the da
20af0 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b  tabase size back
20b00 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
20b10 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20   was before the 
20b20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
20b30 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77  being reverted w
20b40 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  as opened..  */.
20b50 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20b60 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20   = pSavepoint ? 
20b70 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
20b80 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  g : pPager->dbOr
20b90 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  igSize;.  pPager
20ba0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
20bb0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
20bc0 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53  File;..  if( !pS
20bd0 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65  avepoint && page
20be0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20bf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
20c00 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70  gerRollbackWal(p
20c10 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
20c20 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f  * Use pPager->jo
20c30 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20  urnalOff as the 
20c40 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  effective size o
20c50 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  f the main rollb
20c60 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
20c70 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69  .  The actual fi
20c80 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  le might be larg
20c90 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a  er than this in.
20ca0 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e    ** PAGER_JOURN
20cb0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
20cc0 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  or PAGER_JOURNAL
20cd0 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42  MODE_PERSIST.  B
20ce0 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a  ut anything.  **
20cf0 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f   past pPager->jo
20d00 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d  urnalOff is off-
20d10 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20  limits to us..  
20d20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  */.  szJ = pPage
20d30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
20d40 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
20d50 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
20d60 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20  || szJ==0 );..  
20d70 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c  /* Begin by roll
20d80 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
20d90 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
20da0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
20db0 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  at.  ** PagerSav
20dc0 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
20dd0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
20de0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
20df0 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54  l header..  ** T
20e00 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65  here might be re
20e10 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69  cords in the mai
20e20 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68  n journal that h
20e30 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ave a page numbe
20e40 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74  r.  ** greater t
20e50 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
20e60 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70  database size (p
20e70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62  Pager->dbSize) b
20e80 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69  ut those.  ** wi
20e90 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75  ll be skipped au
20ea0 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61  tomatically.  Pa
20eb0 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  ges are added to
20ec0 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20   pDone as they. 
20ed0 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62   ** are played b
20ee0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ack..  */.  if( 
20ef0 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  pSavepoint && !p
20f00 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
20f10 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66  r) ){.    iHdrOf
20f20 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
20f30 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61  iHdrOffset ? pSa
20f40 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
20f50 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70  set : szJ;.    p
20f60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20f70 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
20f80 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69  iOffset;.    whi
20f90 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
20fa0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
20fb0 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20  rnalOff<iHdrOff 
20fc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
20fd0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
20fe0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
20ff0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21000 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
21010 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
21020 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
21030 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NE );.  }else{. 
21040 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21050 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
21060 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
21070 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
21080 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
21090 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
210a0 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
210b0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
210c0 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
210d0 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
210e0 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
210f0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
21100 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
21110 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
21120 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
21130 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
21140 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
21150 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
21160 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
21170 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
21180 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
21190 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
211a0 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
211b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
211c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
211d0 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20   u32 nJRec = 0; 
211e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
211f0 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
21200 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
21210 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
21220 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
21230 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  r, 0, szJ, &nJRe
21240 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
21250 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21260 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20  TE_DONE );..    
21270 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70  /*.    ** The "p
21280 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
21290 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
212a0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
212b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20  ->journalOff".  
212c0 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c    ** test is rel
212d0 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23  ated to ticket #
212e0 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64  2565.  See the d
212f0 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65  iscussion in the
21300 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  .    ** pager_pl
21310 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f  ayback() functio
21320 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  n for additional
21330 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
21340 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52    */.    if( nJR
21350 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  ec==0 .     && p
21360 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
21370 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
21380 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
21390 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20  ->journalOff.   
213a0 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
213b0 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70  = (u32)((szJ - p
213c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
213d0 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  f)/JOURNAL_PG_SZ
213e0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
213f0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72  .    for(ii=0; r
21400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21410 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67  ii<nJRec && pPag
21420 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
21430 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  zJ; ii++){.     
21440 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
21450 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
21460 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
21470 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
21480 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
21490 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
214a0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
214b0 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
214c0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
214d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
214e0 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  =szJ );..  /* Fi
214f0 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b  nally,  rollback
21500 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
21510 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61  sub-journal.  Pa
21520 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a  ge that were.  *
21530 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c  * previously rol
21540 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20  led back out of 
21550 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21560 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20   (and are hence 
21570 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77  in pDone).  ** w
21580 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ill be skipped. 
21590 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   Out-of-range pa
215a0 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69  ges are also ski
215b0 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  pped..  */.  if(
215c0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
215d0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
215e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
215f0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34  unter */.    i64
21600 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70   offset = (i64)p
21610 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
21620 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
21630 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  geSize);..    if
21640 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
21650 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
21660 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61  c = sqlite3WalSa
21670 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67  vepointUndo(pPag
21680 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70  er->pWal, pSavep
21690 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b  oint->aWalData);
216a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
216b0 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
216c0 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
216d0 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
216e0 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
216f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21700 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69   offset==(i64)ii
21710 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
21720 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72  Size) );.      r
21730 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
21740 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
21750 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f  er, &offset, pDo
21760 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 0, 1);.    }
21770 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21780 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
21790 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
217a0 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
217b0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
217c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
217d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
217e0 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20  f = szJ;.  }..  
217f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21800 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
21810 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
21820 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
21830 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
21840 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
21850 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
21860 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
21870 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
21880 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
21890 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
218a0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
218b0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  age);.}../*.** I
218c0 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e  nvoke SQLITE_FCN
218d0 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73  TL_MMAP_SIZE bas
218e0 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
218f0 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61  t value of szMma
21900 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
21910 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d  d pagerFixMaplim
21920 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
21930 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
21940 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
21950 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
21960 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20   = pPager->fd;. 
21970 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20   if( isOpen(fd) 
21980 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  && fd->pMethods-
21990 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a  >iVersion>=3 ){.
219a0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
219b0 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70  4 sz;.    sz = p
219c0 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20  Pager->szMmap;. 
219d0 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46     pPager->bUseF
219e0 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20  etch = (sz>0);. 
219f0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
21a00 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
21a10 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
21a20 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
21a30 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  &sz);.  }.#endif
21a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
21a50 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
21a60 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20  e of any memory 
21a70 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20  mapping made of 
21a80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21a90 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
21aa0 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
21ab0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
21ac0 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
21ad0 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67   szMmap){.  pPag
21ae0 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d  er->szMmap = szM
21af0 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d  map;.  pagerFixM
21b00 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
21b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
21b20 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
21b30 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74   possible from t
21b40 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69  he pager..*/.voi
21b50 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  d sqlite3PagerSh
21b60 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67  rink(Pager *pPag
21b70 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
21b80 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65  acheShrink(pPage
21b90 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
21ba0 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74  /*.** Adjust set
21bb0 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  tings of the pag
21bc0 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  er to those spec
21bd0 69 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46  ified in the pgF
21be0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a  lags parameter..
21bf0 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c  **.** The "level
21c00 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50  " in pgFlags & P
21c10 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
21c20 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72  _MASK sets the r
21c30 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20  obustness.** of 
21c40 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
21c50 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
21c60 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65   crashes or powe
21c70 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a  r failures by.**
21c80 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
21c90 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
21ca0 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68   when writing th
21cb0 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  e journals..** T
21cc0 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
21cd0 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
21ce0 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
21cf0 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
21d00 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
21d10 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
21d20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21d30 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
21d40 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
21d50 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
21d60 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
21d70 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
21d80 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
21d90 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
21da0 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
21db0 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
21dc0 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
21dd0 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
21de0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21df0 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
21e00 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
21e10 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
21e20 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
21e30 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
21e40 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
21e50 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
21e60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
21e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
21e80 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
21e90 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
21ea0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
21eb0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
21ec0 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
21ed0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
21ee0 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
21ef0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
21f00 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
21f10 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
21f20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
21f30 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
21f40 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
21f50 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
21f60 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
21f70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21f80 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
21f90 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
21fa0 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
21fb0 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
21fc0 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
21fd0 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
21fe0 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
21ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
22000 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
22010 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
22020 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
22030 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
22040 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
22050 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
22060 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
22070 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
22080 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
22090 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
220a0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
220b0 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
220c0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ack..**.** The a
220d0 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f  bove is for a ro
220e0 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d  llback-journal m
220f0 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f  ode.  For WAL mo
22100 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65  de, OFF continue
22110 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61  s.** to mean tha
22120 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20  t no syncs ever 
22130 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d  occur.  NORMAL m
22140 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
22150 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70  L is synced.** p
22160 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
22170 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20  t of checkpoint 
22180 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
22190 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 73 79  abase file is sy
221a0 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63  nced.** at the c
221b0 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65  onclusion of the
221c0 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74   checkpoint if t
221d0 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
221e0 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20  t of the WAL.** 
221f0 77 61 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b  was written back
22200 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
22210 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63  se.  But no sync
22220 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75   operations occu
22230 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69  r for.** an ordi
22240 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e  nary commit in N
22250 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20  ORMAL mode with 
22260 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73  WAL.  FULL means
22270 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a   that the WAL.**
22280 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
22290 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63  following each c
222a0 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c  ommit operation,
222b0 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   in addition to 
222c0 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73  the.** syncs ass
222d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52  ociated with NOR
222e0 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  MAL..**.** Do no
222f0 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72  t confuse synchr
22300 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20  onous=FULL with 
22310 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22320 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45  .  The.** SQLITE
22330 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f  _SYNC_FULL macro
22340 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68   means to use th
22350 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66  e MacOSX-style f
22360 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69  ull-fsync.** usi
22370 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46  ng fcntl(F_FULLF
22380 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53  SYNC).  SQLITE_S
22390 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  YNC_NORMAL means
223a0 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64   to do an.** ord
223b0 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63 61  inary fsync() ca
223c0 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ll.  There is no
223d0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
223e0 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  een SQLITE_SYNC_
223f0 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49  FULL.** and SQLI
22400 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
22410 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65  n platforms othe
22420 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20  r than MacOSX.  
22430 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68  But the.** synch
22440 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73  ronous=FULL vers
22450 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  us synchronous=N
22460 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65  ORMAL setting de
22470 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a  termines when.**
22480 20 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69   the xSync primi
22490 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tive is called a
224a0 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74  nd is relevant t
224b0 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e  o all platforms.
224c0 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
224d0 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
224e0 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
224f0 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
22500 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
22510 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
22520 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
22530 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
22540 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
22550 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65 72 20  tFlags(.  Pager 
22560 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
22570 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20  /* The pager to 
22580 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c  set safety level
22590 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e   for */.  unsign
225a0 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
225b0 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73  /* Various flags
225c0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
225d0 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61 67  d level = pgFlag
225e0 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
225f0 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 61 73  ONOUS_MASK;.  as
22600 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26  sert( level>=1 &
22610 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20  & level<=3 );.  
22620 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
22630 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70    (level==1 || p
22640 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
22650 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
22660 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76  >fullSync = (lev
22670 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
22680 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
22690 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
226a0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  noSync ){.    pP
226b0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
226c0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
226d0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
226e0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
226f0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22700 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20  FULLFSYNC ){.   
22710 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
22720 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22730 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65  _FULL;.    pPage
22740 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22750 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
22760 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ULL;.  }else if(
22770 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
22780 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20  _CKPT_FULLFSYNC 
22790 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
227a0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
227b0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
227c0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
227d0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
227e0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
227f0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
22800 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
22810 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22820 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22830 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
22840 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22850 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
22860 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70  walSyncFlags = p
22870 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22880 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
22890 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
228a0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
228b0 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43  lags |= WAL_SYNC
228c0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20  _TRANSACTIONS;. 
228d0 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67 73   }.  if( pgFlags
228e0 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53 50   & PAGER_CACHESP
228f0 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ILL ){.    pPage
22900 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
22910 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b   ~SPILLFLAG_OFF;
22920 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
22930 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
22940 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46   |= SPILLFLAG_OF
22950 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  F;.  }.}.#endif.
22960 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
22970 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
22980 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
22990 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
229a0 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
229b0 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
229c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
229d0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
229e0 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
229f0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
22a00 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
22a10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
22a20 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
22a30 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
22a40 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
22a50 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
22a60 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72  y file..**.** Wr
22a70 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
22a80 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46  criptor into *pF
22a90 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ile. Return SQLI
22aa0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
22ab0 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68   .** or some oth
22ac0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
22ad0 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
22ae0 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
22af0 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  lly .** delete t
22b00 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
22b10 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
22b20 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  sed..**.** The f
22b30 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74  lags passed to t
22b40 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70  he VFS layer xOp
22b50 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68  en() call are th
22b60 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ose specified.**
22b70 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66   by parameter vf
22b80 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68  sFlags ORed with
22b90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
22ba0 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
22bb0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
22bc0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
22bd0 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20  EN_CREATE.**    
22be0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
22bf0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51  LUSIVE.**     SQ
22c00 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
22c10 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69  ONCLOSE.*/.stati
22c20 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74  c int pagerOpent
22c30 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
22c40 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
22c50 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
22c60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
22c70 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
22c80 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
22c90 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
22ca0 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
22cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
22cc0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
22cd0 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
22ce0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
22cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22d00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  urn code */..#if
22d10 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
22d20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
22d30 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
22d40 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
22d50 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
22d60 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
22d70 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
22d80 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22d90 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
22da0 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
22db0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
22dc0 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
22dd0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
22de0 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
22df0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
22e00 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
22e10 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
22e20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
22e30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
22e40 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a  sOpen(pFile) );.
22e50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22e60 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
22e70 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
22e80 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ion..**.** The p
22e90 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65  ager invokes the
22ea0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66   busy-handler if
22eb0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
22ec0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
22ed0 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72  ITE_BUSY when tr
22ee0 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
22ef0 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20  from no-lock to 
22f00 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a  a SHARED lock,.*
22f10 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67  * or when trying
22f20 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
22f30 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
22f40 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
22f50 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f   .** lock. It do
22f60 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20  es *not* invoke 
22f70 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
22f80 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
22f90 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74  from.** SHARED t
22fa0 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77  o RESERVED, or w
22fb0 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
22fc0 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43  om SHARED to EXC
22fd0 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68  LUSIVE.** (which
22fe0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68   occurs during h
22ff0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
23000 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a  ack). Summary:.*
23010 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f  *.**   Transitio
23020 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
23030 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b           | Invok
23040 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a  es xBusyHandler.
23050 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
23060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
23090 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20     NO_LOCK      
230a0 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   -> SHARED_LOCK 
230b0 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20       | Yes.**   
230c0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
230d0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20   RESERVED_LOCK  
230e0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52    | No.**   SHAR
230f0 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43  ED_LOCK   -> EXC
23100 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
23110 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44  No.**   RESERVED
23120 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49  _LOCK -> EXCLUSI
23130 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a  VE_LOCK   | Yes.
23140 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73  **.** If the bus
23150 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
23160 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ck returns non-z
23170 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
23180 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66   .** retried. If
23190 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
231a0 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54  , then the SQLIT
231b0 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a  E_BUSY error is.
231c0 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ** returned to t
231d0 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65  he caller of the
231e0 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
231f0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
23200 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
23210 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72  handler(.  Pager
23220 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
23230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23240 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
23250 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
23260 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29  Handler)(void *)
23270 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ,         /* Poi
23280 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e  nter to busy-han
23290 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  dler function */
232a0 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
232b0 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20  ndlerArg        
232c0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
232d0 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ent to pass to x
232e0 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29  BusyHandler */.)
232f0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73  {.  pPager->xBus
23300 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79  yHandler = xBusy
23310 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65  Handler;.  pPage
23320 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
23330 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  rg = pBusyHandle
23340 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f  rArg;..  if( isO
23350 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
23360 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70  ){.    void **ap
23370 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61   = (void **)&pPa
23380 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
23390 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  r;.    assert( (
233a0 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29  (int(*)(void *))
233b0 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48  (ap[0]))==xBusyH
233c0 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73  andler );.    as
233d0 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75  sert( ap[1]==pBu
233e0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a  syHandlerArg );.
233f0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
23400 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
23410 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
23420 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45  FCNTL_BUSYHANDLE
23430 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a  R, (void *)ap);.
23440 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
23450 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
23460 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
23470 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
23480 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
23490 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
234a0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
234b0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
234c0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
234d0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
234e0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
234f0 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
23500 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
23510 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
23520 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
23530 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
23540 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
23550 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  RR, an SQLITE_IO
23560 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65  ERR_xxx sub-code
23570 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29   or SQLITE_FULL)
23580 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
23590 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  e, if all of the
235a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
235b0 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74  rue:.**.**   * t
235c0 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
235d0 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67   (value of *pPag
235e0 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20  eSize) is valid 
235f0 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20  (a power .**    
23600 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20   of two between 
23610 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d  512 and SQLITE_M
23620 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e  AX_PAGE_SIZE, in
23630 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a  clusive), and.**
23640 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72  .**   * there ar
23650 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
23660 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
23670 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
23680 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
23690 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e  either not an in
236a0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
236b0 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20   or it is.**    
236c0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
236d0 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72  tabase that curr
236e0 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f  ently consists o
236f0 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a  f zero pages..**
23700 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67  .** then the pag
23710 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73  er object page s
23720 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70  ize is set to *p
23730 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
23740 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
23750 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
23760 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
23770 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65  uses sqlite3Page
23780 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f  rMalloc() .** to
23790 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61   obtain a new Pa
237a0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
237b0 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c  ffer. If this al
237c0 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
237d0 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49   .** fails, SQLI
237e0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
237f0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
23800 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75  e size remains u
23810 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e  nchanged. .** In
23820 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
23830 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
23840 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
23850 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
23860 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20  is not changed, 
23870 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f  either because o
23880 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72  ne of the enumer
23890 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ated.** conditio
238a0 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ns above is not 
238b0 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20  true, the pager 
238c0 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61  was in error sta
238d0 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
238e0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
238f0 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20  led, or because 
23900 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
23910 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61  ation attempt fa
23920 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a  iled, .** then *
23930 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74  pPageSize is set
23940 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74   to the old, ret
23950 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20  ained page size 
23960 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
23970 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23980 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
23990 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
239a0 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20  u32 *pPageSize, 
239b0 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20  int nReserve){. 
239c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
239d0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  _OK;..  /* It is
239e0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
239f0 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72   do a full asser
23a00 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
23a10 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20  here, as this.  
23a20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  ** function may 
23a30 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
23a40 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28  ithin PagerOpen(
23a50 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74  ), before the st
23a60 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ate.  ** of the 
23a70 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  Pager object is 
23a80 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69  internally consi
23a90 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stent..  **.  **
23aa0 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
23ab0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
23ac0 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  rned an error if
23ad0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
23ae0 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52  n .  ** PAGER_ER
23af0 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73  ROR state. But s
23b00 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52  ince PAGER_ERROR
23b10 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65   state guarantee
23b20 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72  s that.  ** ther
23b30 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  e is at least on
23b40 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  e outstanding pa
23b50 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68  ge reference, th
23b60 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
23b70 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
23b80 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77  that case anyhow
23b90 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61  ..  */..  u32 pa
23ba0 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
23bb0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
23bc0 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
23bd0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
23be0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
23bf0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
23c00 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
23c10 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
23c20 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
23c30 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63  .   && sqlite3Pc
23c40 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
23c50 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
23c60 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65   .   && pageSize
23c70 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75   && pageSize!=(u
23c80 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
23c90 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ize .  ){.    ch
23ca0 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b  ar *pNew = NULL;
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23cc0 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a  New temp space *
23cd0 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20  /.    i64 nByte 
23ce0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50  = 0;..    if( pP
23cf0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
23d00 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65  ER_OPEN && isOpe
23d10 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
23d20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23d30 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
23d40 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65  ager->fd, &nByte
23d50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
23d60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23d70 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28  {.      pNew = (
23d80 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
23d90 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
23da0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
23db0 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54  New ) rc = SQLIT
23dc0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a  E_NOMEM;.    }..
23dd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23de0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
23df0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
23e00 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
23e10 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
23e20 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
23e30 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
23e40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
23e50 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
23e60 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
23e70 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
23e80 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
23e90 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
23ea0 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
23eb0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
23ec0 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67  SetPageSize(pPag
23ed0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
23ee0 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
23ef0 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20  }..  *pPageSize 
23f00 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
23f10 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ze;.  if( rc==SQ
23f20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
23f30 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20  f( nReserve<0 ) 
23f40 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65  nReserve = pPage
23f50 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  r->nReserve;.   
23f60 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
23f70 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
23f80 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61  <1000 );.    pPa
23f90 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
23fa0 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (i16)nReserve;. 
23fb0 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
23fc0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
23fd0 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
23fe0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
23ff0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24000 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
24010 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
24020 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
24030 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
24040 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
24050 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
24060 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
24070 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
24080 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
24090 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
240a0 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
240b0 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
240c0 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
240d0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
240e0 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
240f0 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
24100 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
24110 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
24120 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
24130 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
24140 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
24150 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
24160 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
24170 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
24180 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
24190 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
241a0 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
241b0 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
241c0 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
241d0 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
241e0 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
241f0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
24200 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
24210 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
24220 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
24230 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
24240 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
24250 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
24260 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
24270 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
24280 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
24290 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
242a0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
242b0 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
242c0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
242d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
242e0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
242f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24300 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
24310 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
24320 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
24330 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
24340 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24350 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
24360 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61  EN );      /* Ca
24370 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f  lled only by OP_
24380 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73  MaxPgcnt */.  as
24390 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78  sert( pPager->mx
243a0 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno>=pPager->db
243b0 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d  Size );  /* OP_M
243c0 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73  axPgcnt enforces
243d0 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72   this */.  retur
243e0 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
243f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
24400 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
24410 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
24420 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
24430 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
24440 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
24450 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
24460 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
24470 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
24480 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
24490 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
244a0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
244b0 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
244c0 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
244d0 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
244e0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
244f0 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
24500 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
24510 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
24520 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
24530 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
24540 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
24550 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
24560 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
24570 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
24580 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
24590 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
245a0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
245b0 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
245c0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
245d0 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
245e0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
245f0 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
24600 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
24610 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
24620 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24630 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
24640 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
24650 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
24660 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
24670 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
24680 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
24690 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
246a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
246b0 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
246c0 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
246d0 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
246e0 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
246f0 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
24700 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74   to. .**.** If t
24710 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65  he pager was ope
24720 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65  ned on a transie
24730 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61  nt file (zFilena
24740 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f  me==""), or.** o
24750 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20  pened on a file 
24760 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65  less than N byte
24770 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f  s in size, the o
24780 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a  utput buffer is.
24790 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51  ** zeroed and SQ
247a0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
247b0 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20  . The rationale 
247c0 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
247d0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
247e0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
247f0 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ad database head
24800 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74  ers, and a new t
24810 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a  ransient or.** z
24820 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61  ero sized databa
24830 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20  se has a header 
24840 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e  than consists en
24850 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73  tirely of zeroes
24860 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49  ..**.** If any I
24870 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72  O error apart fr
24880 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  om SQLITE_IOERR_
24890 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e  SHORT_READ is en
248a0 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68  countered,.** th
248b0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
248c0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
248d0 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63  caller and the c
248e0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
248f0 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  * output buffer 
24900 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e  undefined..*/.in
24910 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
24920 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
24930 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
24940 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
24950 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
24960 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24970 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
24980 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28  0, N);.  assert(
24990 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
249a0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
249b0 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  empFile );..  /*
249c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
249d0 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
249e0 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c  btree immediatel
249f0 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67  y after creating
24a00 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20  .  ** the Pager 
24a10 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68  object.  There h
24a20 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f  as not been an o
24a30 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72  pportunity to tr
24a40 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  ansition.  ** to
24a50 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20   WAL mode yet.. 
24a60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
24a70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
24a80 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f  r) );..  if( isO
24a90 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
24aa0 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
24ab0 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
24ac0 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
24ad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24ae0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
24af0 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
24b00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24b10 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
24b20 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
24b30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
24b40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
24b50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
24b60 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f  s function may o
24b70 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
24b80 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
24b90 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
24ba0 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49  .** the pager. I
24bb0 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  t returns the to
24bc0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
24bd0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
24be0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76  ase..**.** Howev
24bf0 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20  er, if the file 
24c00 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  is between 1 and
24c10 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74   <page-size> byt
24c20 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e  es in size, then
24c30 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e   .** this is con
24c40 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65  sidered a 1 page
24c50 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
24c60 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
24c70 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
24c80 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29  er, int *pnPage)
24c90 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
24ca0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
24cb0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
24cc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
24cd0 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54  tate!=PAGER_WRIT
24ce0 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20  ER_FINISHED );. 
24cf0 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29   *pnPage = (int)
24d00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
24d10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
24d20 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
24d30 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
24d40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
24d50 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
24d60 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
24d70 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
24d80 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
24d90 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
24da0 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
24db0 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
24dc0 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
24dd0 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
24de0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
24df0 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
24e00 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
24e10 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
24e20 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
24e30 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
24e40 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
24e50 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
24e60 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
24e70 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
24e80 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
24e90 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
24ea0 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
24eb0 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
24ec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
24ed0 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
24ee0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
24ef0 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
24f00 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
24f10 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
24f20 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
24f30 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
24f40 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
24f50 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
24f60 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
24f70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
24f80 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
24f90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24fa0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
24fb0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fd0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
24fe0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ode */..  /* Che
24ff0 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
25000 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
25010 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
25020 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
25030 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
25040 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
25050 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61  transistions tha
25060 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
25070 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
25080 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
25090 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
250a0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
250b0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
250c0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
250d0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
250e0 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d  (pPager->eLock>=
250f0 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
25100 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
25110 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c  ck==NO_LOCK && l
25120 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
25130 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20  LOCK).       || 
25140 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
25150 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
25160 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
25170 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a  SIVE_LOCK).  );.
25180 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
25190 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
251a0 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  ger, locktype);.
251b0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
251c0 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61  LITE_BUSY && pPa
251d0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
251e0 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
251f0 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20  andlerArg) );.  
25200 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25210 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73  .** Function ass
25220 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25230 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68  raint(pPager) ch
25240 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  ecks that one of
25250 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69   the .** followi
25260 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61  ng is true for a
25270 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63  ll dirty pages c
25280 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
25290 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a  page-cache:.**.*
252a0 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20  *   a) The page 
252b0 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
252c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
252d0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
252e0 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74  .**      current
252f0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
25300 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a   in pages, OR.**
25310 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20  .**   b) if the 
25320 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72  page content wer
25330 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69  e written at thi
25340 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64  s time, it would
25350 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20   not.**      be 
25360 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
25370 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  te the current c
25380 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68  ontent out to th
25390 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
253a0 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d        (as determ
253b0 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e  ined by function
253c0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
253d0 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  e())..**.** If t
253e0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73  he condition ass
253f0 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75  erted by this fu
25400 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20  nction were not 
25410 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a  true, and the.**
25420 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65   dirty page were
25430 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64   to be discarded
25440 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
25450 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72  via the pagerStr
25460 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ess().** routine
25470 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  , pagerStress() 
25480 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20  would not write 
25490 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
254a0 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74   content to.** t
254b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
254c0 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74  . If a savepoint
254d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72   transaction wer
254e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66  e rolled back af
254f0 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70  ter.** this happ
25500 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63  ened, the correc
25510 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c 64  t behavior would
25520 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74   be to restore t
25530 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
25540 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
25550 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  e. However, sinc
25560 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69  e this content i
25570 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
25580 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64   either.** the d
25590 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
255a0 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  the portion of t
255b0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
255c0 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d  nal and .** sub-
255d0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62  journal rolled b
255e0 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ack the content 
255f0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73  could not be res
25600 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  tored and the.**
25610 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
25620 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  would become cor
25630 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72  rupt. It is ther
25640 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20  efore fortunate 
25650 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69  that .** this ci
25660 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f  rcumstance canno
25670 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20  t arise..*/.#if 
25680 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
25690 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).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 43 62 28 50 67 48  ConstraintCb(PgH
256c0 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  dr *pPg){.  asse
256d0 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
256e0 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
256f0 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71  assert( !subjReq
25700 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c  uiresPage(pPg) |
25710 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67  | pPg->pgno<=pPg
25720 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ->pPager->dbSize
25730 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   );.}.static voi
25740 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
25750 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72  Constraint(Pager
25760 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
25770 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
25780 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
25790 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72  PCache, assertTr
257a0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
257b0 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Cb);.}.#else.# d
257c0 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e  efine assertTrun
257d0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
257e0 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f  Pager).#endif../
257f0 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
25800 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
25810 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
25820 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
25830 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
25840 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
25850 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
25860 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
25870 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
25880 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
25890 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
258a0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
258b0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
258c0 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
258d0 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
258e0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
258f0 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
25900 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
25910 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
25920 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65  led right before
25930 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
25940 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e  ansaction..** On
25950 63 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ce this function
25960 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
25970 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
25980 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65  n must either be
25990 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
259a0 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74  or committed. It
259b0 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
259c0 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
259d0 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63  on and.** then c
259e0 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20  ontinue writing 
259f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
25a00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25a10 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
25a20 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
25a30 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
25a40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25a50 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29  >dbSize>=nPage )
25a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25a70 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
25a80 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
25a90 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  D );.  pPager->d
25aa0 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a  bSize = nPage;..
25ab0 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    /* At one poin
25ac0 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  t the code here 
25ad0 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75  called assertTru
25ae0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25af0 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65  ) to.  ** ensure
25b00 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
25b10 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20  being truncated 
25b20 61 77 61 79 20 62 79 20 74 68 69 73 20 6f 70 65  away by this ope
25b30 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a  ration are,.  **
25b40 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
25b50 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f  savepoints are o
25b60 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20  pen, present in 
25b70 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
25b80 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74   ** journal so t
25b90 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20  hat they can be 
25ba0 72 65 73 74 6f 72 65 64 20 69 66 20 74 68 65 20  restored if the 
25bb0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c  savepoint is rol
25bc0 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54  led.  ** back. T
25bd0 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  his is no longer
25be0 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
25bf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
25c00 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c  ow only.  ** cal
25c10 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65  led right before
25c20 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
25c30 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c  ansaction. So al
25c40 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a  though the .  **
25c50 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61   Pager object ma
25c60 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65  y still have ope
25c70 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61  n savepoints (Pa
25c80 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d  ger.nSavepoint!=
25c90 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63  0), .  ** they c
25ca0 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
25cb0 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73  back. So the ass
25cc0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25cd0 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a  raint() call.  *
25ce0 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63  * is no longer c
25cf0 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f  orrect. */.}.../
25d00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25d10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
25d20 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
25d30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
25d40 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e  lback. It.** syn
25d50 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  cs the journal f
25d60 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65  ile to disk, the
25d70 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a  n sets pPager->j
25d80 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65  ournalHdr to the
25d90 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
25da0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20  journal file so 
25db0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70  that the pager_p
25dc0 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
25dd0 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20  e knows.** that 
25de0 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
25df0 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
25e00 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53   synced..**.** S
25e10 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  yncing a hot-jou
25e20 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66  rnal to disk bef
25e30 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
25e40 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65  o roll it back e
25e50 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20  nsures .** that 
25e60 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75  if a power-failu
25e70 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  re occurs during
25e80 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74   the rollback, t
25e90 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a  he process that.
25ea0 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c  ** attempts roll
25eb0 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73  back following s
25ec0 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73  ystem recovery s
25ed0 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75  ees the same jou
25ee0 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rnal.** content 
25ef0 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  as this process.
25f00 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
25f10 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61  hing goes as pla
25f20 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  nned, SQLITE_OK 
25f30 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
25f40 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53  erwise, .** an S
25f50 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
25f60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25f70 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
25f80 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
25f90 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
25fa0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
25fb0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
25fc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
25fd0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
25fe0 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
25ff0 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a  NC_NORMAL);.  }.
26000 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26010 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
26020 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
26030 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
26040 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
26050 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dr);.  }.  retur
26060 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
26070 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
26080 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61  e to a memory ma
26090 70 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74  pped page object
260a0 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
260b0 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e   pgno. .** The n
260c0 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75  ew object will u
260d0 73 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  se the pointer p
260e0 44 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66  Data, obtained f
260f0 72 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a  rom xFetch()..**
26100 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
26110 73 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70  set *ppPage to p
26120 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
26130 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a  page reference.*
26140 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  * and return SQL
26150 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
26160 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  e, return an SQL
26170 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61  ite error code a
26180 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67  nd set.** *ppPag
26190 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  e to zero..**.**
261a0 20 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   Page references
261b0 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c   obtained by cal
261c0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
261d0 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c  on should be rel
261e0 65 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c  eased.** by call
261f0 69 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65  ing pagerRelease
26200 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
26210 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63  atic int pagerAc
26220 71 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20  quireMapPage(.  
26230 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26250 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
26260 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26280 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
26290 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ber */.  void *p
262a0 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
262b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
262c0 63 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20  ch()'d data for 
262d0 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
262e0 67 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20  gHdr **ppPage   
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26300 2a 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20  * OUT: Acquired 
26310 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  page object */.)
26320 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
26330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26340 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
26350 70 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74  pped page to ret
26360 75 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  urn */..  if( pP
26370 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26380 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  ist ){.    *ppPa
26390 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d  ge = p = pPager-
263a0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a  >pMmapFreelist;.
263b0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61      pPager->pMma
263c0 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70  pFreelist = p->p
263d0 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
263e0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65  irty = 0;.    me
263f0 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20  mset(p->pExtra, 
26400 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
26410 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  a);.  }else{.   
26420 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28   *ppPage = p = (
26430 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d  PgHdr *)sqlite3M
26440 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
26450 28 50 67 48 64 72 29 20 2b 20 70 50 61 67 65 72  (PgHdr) + pPager
26460 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69  ->nExtra);.    i
26470 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( p==0 ){.     
26480 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
26490 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
264a0 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50  64)(pgno-1) * pP
264b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
264c0 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65  pData);.      re
264d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
264e0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  M;.    }.    p->
264f0 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a  pExtra = (void *
26500 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66  )&p[1];.    p->f
26510 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41  lags = PGHDR_MMA
26520 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  P;.    p->nRef =
26530 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65   1;.    p->pPage
26540 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a  r = pPager;.  }.
26550 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
26560 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70  xtra==(void *)&p
26570 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  [1] );.  assert(
26580 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a   p->pPage==0 );.
26590 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61    assert( p->fla
265a0 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29  gs==PGHDR_MMAP )
265b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
265c0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
265d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52  .  assert( p->nR
265e0 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70  ef==1 );..  p->p
265f0 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d  gno = pgno;.  p-
26600 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a  >pData = pData;.
26610 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
26620 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ut++;..  return 
26630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
26640 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
26650 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
26660 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61  pPg. pPg must ha
26670 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64  ve been returned
26680 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69   by an .** earli
26690 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  er call to pager
266a0 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29  AcquireMapPage()
266b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
266c0 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
266d0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
266e0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
266f0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
26700 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
26710 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44  Out--;.  pPg->pD
26720 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
26730 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
26740 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
26750 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20  elist = pPg;..  
26760 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26770 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
26780 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73  ersion>=3 );.  s
26790 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
267a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
267b0 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70  )(pPg->pgno-1)*p
267c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
267d0 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a   pPg->pData);.}.
267e0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
267f0 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74  PgHdr objects st
26800 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65  ored in the Page
26810 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  r.pMmapFreelist 
26820 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
26830 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61  void pagerFreeMa
26840 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61  pHdrs(Pager *pPa
26850 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
26860 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  ;.  PgHdr *pNext
26870 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
26880 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
26890 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
268a0 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69    pNext = p->pDi
268b0 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rty;.    sqlite3
268c0 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
268d0 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
268e0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
268f0 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
26900 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
26910 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
26920 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
26930 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
26940 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
26950 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
26960 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
26970 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
26980 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
26990 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
269a0 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
269b0 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
269c0 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
269d0 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
269e0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
269f0 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
26a00 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
26a10 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
26a20 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
26a30 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
26a40 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
26a50 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
26a60 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
26a70 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
26a80 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
26a90 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
26aa0 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
26ab0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
26ac0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
26ad0 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
26ae0 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
26af0 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
26b00 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
26b10 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
26b20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
26b30 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
26b40 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
26b50 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20  er){.  u8 *pTmp 
26b60 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
26b70 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73  pTmpSpace;..  as
26b80 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
26b90 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
26ba0 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69   );.  disable_si
26bb0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
26bc0 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
26bd0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
26be0 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61  );.  pagerFreeMa
26bf0 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20  pHdrs(pPager);. 
26c00 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43   /* pPager->errC
26c10 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ode = 0; */.  pP
26c20 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
26c30 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
26c40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
26c50 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f  .  sqlite3WalClo
26c60 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  se(pPager->pWal,
26c70 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
26c80 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e  cFlags, pPager->
26c90 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b  pageSize, pTmp);
26ca0 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  .  pPager->pWal 
26cb0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61  = 0;.#endif.  pa
26cc0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
26cd0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
26ce0 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
26cf0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  ck(pPager);.  }e
26d00 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69  lse{.    /* If i
26d10 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20  t is open, sync 
26d20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26d30 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
26d40 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
26d50 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  k..    ** If thi
26d60 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74  s is not done, t
26d70 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20  hen an unsynced 
26d80 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  portion of the o
26d90 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20  pen journal .   
26da0 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20   ** file may be 
26db0 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f  played back into
26dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
26dd0 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
26de0 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a  e occurs .    **
26df0 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68   while this is h
26e00 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61  appening, the da
26e10 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63  tabase could bec
26e20 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20  ome corrupt..   
26e30 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e   **.    ** If an
26e40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
26e50 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79  ile trying to sy
26e60 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  nc the journal, 
26e70 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a  shift the pager.
26e80 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
26e90 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69  ERROR state. Thi
26ea0 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41  s causes UnlockA
26eb0 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e  ndRollback to un
26ec0 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20  lock the.    ** 
26ed0 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f  database and clo
26ee0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
26ef0 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65  ile without atte
26f00 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
26f10 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72  t.    ** back or
26f20 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68   finalize it. Th
26f30 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20  e next database 
26f40 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74  user will have t
26f50 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  o do hot-journal
26f60 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
26f70 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e   before accessin
26f80 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
26f90 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
26fa0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
26fb0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
26fc0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
26fd0 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f  ger, pagerSyncHo
26fe0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
26ff0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
27000 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
27010 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
27020 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
27030 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65  ignMalloc();.  e
27040 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
27050 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50  io_errors();.  P
27060 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53  AGERTRACE(("CLOS
27070 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
27080 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f  (pPager)));.  IO
27090 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
270a0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
270b0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
270c0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73  Pager->jfd);.  s
270d0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
270e0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c  ager->fd);.  sql
270f0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d  ite3PageFree(pTm
27100 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  p);.  sqlite3Pca
27110 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  cheClose(pPager-
27120 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64  >pPCache);..#ifd
27130 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
27140 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72  DEC.  if( pPager
27150 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70  ->xCodecFree ) p
27160 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
27170 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  e(pPager->pCodec
27180 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
27190 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53  ert( !pPager->aS
271a0 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61  avepoint && !pPa
271b0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
271c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
271d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
271e0 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
271f0 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20  ger->sjfd) );.. 
27200 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
27210 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
27220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
27230 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
27240 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
27250 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
27260 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
27270 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65   number for page
27280 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71   pPg..*/.Pgno sq
27290 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
272a0 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67  mber(DbPage *pPg
272b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
272c0 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
272d0 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
272e0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
272f0 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  ount for page pP
27300 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
27310 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
27320 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  e *pPg){.  sqlit
27330 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29  e3PcacheRef(pPg)
27340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
27350 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  the journal. In 
27360 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
27370 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
27380 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
27390 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
273a0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
273b0 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
273c0 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
273d0 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  of the.** disk a
273e0 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  nd can be restor
273f0 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
27400 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
27410 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
27420 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f   If the Pager.no
27430 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
27440 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
27450 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
27460 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
27470 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
27480 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
27490 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61  e journal-mode a
274a0 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63  nd the .** devic
274b0 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
274c0 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79  s of the file-sy
274d0 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
274e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
274f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27500 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
27510 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
27520 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
27530 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
27540 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
27550 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
27560 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
27570 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
27580 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
27590 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
275a0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
275b0 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
275c0 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
275d0 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
275e0 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
275f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
27600 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
27610 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
27620 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
27630 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
27640 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
27650 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
27660 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
27670 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
27680 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
27690 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
276a0 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
276b0 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
276c0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
276d0 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
276e0 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
276f0 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
27700 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
27710 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
27720 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
27730 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
27740 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
27750 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
27760 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
27770 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
27780 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
27790 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
277a0 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
277b0 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
277c0 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
277d0 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
277e0 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
277f0 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
27800 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
27810 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
27820 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
27830 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  rs the PGHDR_NEE
27840 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65  D_SYNC flag of e
27850 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75  very .** page cu
27860 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20  rrently held in 
27870 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65  memory before re
27880 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
27890 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65  K. If an IO.** e
278a0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
278b0 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  red, then the IO
278c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
278d0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
278e0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
278f0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
27900 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
27910 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69  int newHdr){.  i
27920 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27940 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
27950 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
27960 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
27970 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
27980 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
27990 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
279a0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
279b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
279c0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
279d0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
279e0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
279f0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
27a00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27a10 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
27a20 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
27a30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
27a40 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
27a50 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
27a60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
27a70 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
27a80 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
27a90 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27aa0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
27ab0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
27ac0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
27ad0 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Y ){.      const
27ae0 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
27af0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
27b00 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
27b10 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
27b20 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
27b30 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
27b40 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
27b50 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
27b60 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
27b70 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
27b80 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
27b90 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
27ba0 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
27bb0 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
27bc0 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
27bd0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
27be0 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
27bf0 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
27c00 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
27c10 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
27c20 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
27c30 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
27c40 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
27c50 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
27c60 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
27c70 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
27c80 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
27c90 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
27ca0 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
27cb0 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
27cc0 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
27cd0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
27ce0 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
27cf0 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20  us connection's 
27d00 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
27d10 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
27d20 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
27d30 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
27d40 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
27d50 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
27d60 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
27d70 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
27d80 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
27d90 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
27da0 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
27db0 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
27dc0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
27dd0 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
27de0 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
27df0 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
27e00 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
27e10 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
27e20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
27e30 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
27e40 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
27e50 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
27e60 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
27e70 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
27e80 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
27e90 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
27ea0 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
27eb0 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
27ec0 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
27ed0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
27ee0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
27ef0 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
27f00 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
27f10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
27f20 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
27f30 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
27f40 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
27f50 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
27f60 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
27f70 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
27f80 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
27f90 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
27fa0 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
27fb0 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
27fc0 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
27fd0 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
27fe0 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
27ff0 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
28000 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
28010 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
28020 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
28030 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
28040 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
28050 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
28060 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
28070 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
28080 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
28090 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
280a0 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
280b0 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
280c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
280d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
280e0 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
280f0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
28100 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20  8 aMagic[8];.   
28110 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b       u8 zHeader[
28120 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
28130 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20  agic)+4];..     
28140 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
28150 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
28160 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
28170 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
28180 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
28190 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
281a0 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
281b0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
281c0 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
281d0 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
281e0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
281f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28200 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
28210 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
28220 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
28230 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
28240 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28250 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
28260 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
28270 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
28280 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
28290 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
282a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
282b0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
282c0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
282d0 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
282e0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
282f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
28300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
28310 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
28320 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
28330 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
28340 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
28350 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
28360 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
28370 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
28380 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
28390 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
283a0 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
283b0 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
283c0 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
283d0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
283e0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
283f0 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
28400 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
28410 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
28420 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
28430 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
28440 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
28450 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
28460 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
28470 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
28480 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
28490 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
284a0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
284b0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
284c0 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
284d0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
284e0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
284f0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
28500 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
28510 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
28520 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
28530 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
28540 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
28550 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
28560 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
28570 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
28580 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
28590 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
285a0 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
285b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
285c0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
285d0 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
285e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
285f0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
28600 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28610 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
28620 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
28630 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
28640 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
28650 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
28660 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
28670 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
28680 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
28690 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
286a0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
286b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
286c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
286d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
286e0 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
286f0 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
28700 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
28710 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  lHdr));.        
28720 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
28730 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ite(.           
28740 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48   pPager->jfd, zH
28750 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
28760 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e  eader), pPager->
28770 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
28780 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
28790 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
287a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
287b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
287c0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
287d0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
287e0 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
287f0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
28800 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
28810 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
28820 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
28830 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
28840 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
28850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28860 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
28870 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
28880 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
28890 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  (pPager->syncFla
288a0 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
288b0 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
288c0 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
288d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
288e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
288f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
28900 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
28910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
28920 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
28930 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28  alOff;.      if(
28940 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69   newHdr && 0==(i
28950 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
28960 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
28970 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28980 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
28990 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
289a0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
289b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
289c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
289d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
289e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
289f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
28a00 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
28a10 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
28a20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20   }..  /* Unless 
28a30 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
28a40 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  noSync mode, the
28a50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61   journal file wa
28a60 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63  s just .  ** suc
28a70 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
28a80 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c  . Either way, cl
28a90 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
28aa0 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
28ab0 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e  .  ** all pages.
28ac0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
28ad0 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
28ae0 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
28af0 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  che);.  pPager->
28b00 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
28b10 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61  RITER_DBMOD;.  a
28b20 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
28b30 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
28b40 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
28b50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
28b60 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
28b70 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
28b80 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
28b90 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e  dirty pages conn
28ba0 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ected.** by the 
28bb0 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
28bc0 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  nter. This funct
28bd0 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20  ion writes each 
28be0 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  one of the.** in
28bf0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e  -memory pages in
28c00 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65   the list to the
28c10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
28c20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  The argument may
28c30 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70  .** be NULL, rep
28c40 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70  resenting an emp
28c50 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73  ty list. In this
28c60 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
28c70 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ion is.** a no-o
28c80 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  p..**.** The pag
28c90 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20  er must hold at 
28ca0 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
28cb0 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20   lock when this 
28cc0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
28cd0 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72  alled. Before wr
28ce0 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74  iting anything t
28cf0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
28d00 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a  ile, this lock.*
28d10 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  * is upgraded to
28d20 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
28d30 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
28d40 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
28d50 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed,.** SQLITE_BU
28d60 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SY is returned a
28d70 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72  nd no data is wr
28d80 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
28d90 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
28da0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
28db0 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70  is a temp-file p
28dc0 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74  ager and the act
28dd0 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ual file-system 
28de0 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79  file.** is not y
28df0 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63  et open, it is c
28e00 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
28e10 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
28e20 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  a is .** written
28e30 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65   out..**.** Once
28e40 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
28e50 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c  en upgraded and,
28e60 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
28e70 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a  he file opened,.
28e80 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65  ** the pages are
28e90 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
28ea0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28eb0 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e  e in list order.
28ec0 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61   Writing.** a pa
28ed0 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ge is skipped if
28ee0 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72   it meets either
28ef0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
28f00 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a  g criteria:.**.*
28f10 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e  *   * The page n
28f20 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
28f30 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
28f40 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68  ze, or.**   * Th
28f50 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
28f60 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
28f70 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
28f80 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74  * If writing out
28f90 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74   a page causes t
28fa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28fb0 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e   to grow, Pager.
28fc0 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73  dbFileSize.** is
28fd0 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
28fe0 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20  ngly. If page 1 
28ff0 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20  is written out, 
29000 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63  then the value c
29010 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65  ached.** in Page
29020 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
29030 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74  s updated to mat
29040 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ch the new value
29050 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
29060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29070 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
29080 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
29090 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
290a0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
290b0 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
290c0 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
290d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
290e0 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45  ed. Or, if the E
290f0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61  XCLUSIVE lock ca
29100 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69  nnot.** be obtai
29110 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ned, SQLITE_BUSY
29120 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
29130 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
29140 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
29150 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
29160 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
29170 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29180 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
29190 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
291a0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
291b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
291c0 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72  nly called for r
291d0 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69  ollback pagers i
291e0 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73  n WRITER_DBMOD s
291f0 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tate. */.  asser
29200 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
29210 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
29220 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
29230 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
29240 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73  R_DBMOD );.  ass
29250 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
29260 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
29270 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
29280 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
29290 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
292a0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
292b0 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
292c0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
292d0 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
292e0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
292f0 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
29300 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
29310 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
29320 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
29330 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
29340 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
29350 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
29360 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
29370 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
29380 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
29390 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
293a0 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
293b0 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
293c0 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
293d0 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
293e0 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
293f0 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
29400 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
29410 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
29420 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
29430 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
29440 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
29450 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
29460 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
29470 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29480 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72  OK .   && pPager
29490 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61  ->dbHintSize<pPa
294a0 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26  ger->dbSize.   &
294b0 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  & (pList->pDirty
294c0 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e   || pList->pgno>
294d0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
294e0 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ze).  ){.    sql
294f0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
29500 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
29510 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
29520 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
29530 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
29540 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
29550 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
29560 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
29570 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b  _HINT, &szFile);
29580 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48  .    pPager->dbH
29590 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  intSize = pPager
295a0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ->dbSize;.  }.. 
295b0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
295c0 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
295d0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
295e0 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
295f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
29600 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
29610 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
29620 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
29630 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
29640 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
29650 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
29660 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
29670 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
29680 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
29690 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
296a0 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
296b0 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
296c0 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
296d0 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
296e0 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
296f0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
29700 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
29710 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
29720 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
29730 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
29740 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
29750 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
29760 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
29770 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
29780 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
29790 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
297a0 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
297b0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
297c0 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
297d0 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
297e0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
297f0 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66  geSize;   /* Off
29800 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  set to write */.
29810 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
29820 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
29830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29840 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20       /* Data to 
29850 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20  write */    ..  
29860 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69      assert( (pLi
29870 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
29880 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
29890 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
298a0 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
298b0 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
298c0 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20  unter(pList);.. 
298d0 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74       /* Encode t
298e0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
298f0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
29900 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
29910 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72  , pgno, 6, retur
29920 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
29930 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  pData);..      /
29940 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20  * Write out the 
29950 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20  page data. */.  
29960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29970 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
29980 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
29990 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
299a0 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  set);..      /* 
299b0 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75  If page 1 was ju
299c0 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  st written, upda
299d0 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  te Pager.dbFileV
299e0 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20  ers to match.   
299f0 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
29a00 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68  now stored in th
29a10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29a20 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73   If writing this
29a30 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20   .      ** page 
29a40 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62  caused the datab
29a50 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
29a60 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53  , update dbFileS
29a70 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ize. .      */. 
29a80 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31       if( pgno==1
29a90 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
29aa0 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
29ab0 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
29ac0 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
29ad0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
29ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29af0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
29b00 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
29b10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
29b20 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
29b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
29b40 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
29b50 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b  ER_STAT_WRITE]++
29b60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
29b70 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
29b80 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
29b90 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
29ba0 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
29bb0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
29bc0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
29bd0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
29be0 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
29bf0 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
29c00 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
29c10 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
29c20 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
29c30 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
29c40 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
29c50 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
29c60 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
29c70 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
29c80 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
29c90 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
29ca0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
29cb0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
29cc0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73  count);.    }els
29cd0 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
29ce0 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
29cf0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
29d00 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
29d10 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
29d20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
29d30 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  sh(pList);.    p
29d40 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
29d50 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  irty;.  }..  ret
29d60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29d70 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   Ensure that the
29d80 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
29d90 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74  e is open. If it
29da0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
29db0 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
29dc0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
29dd0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
29de0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
29df0 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
29e00 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
29e10 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  . An .** SQLITE_
29e20 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
29e30 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
29e40 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   if a call to sq
29e50 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a  lite3OsOpen() .*
29e60 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * fails..*/.stat
29e70 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
29e80 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
29e90 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
29ea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
29eb0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
29ec0 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  ->sjfd) ){.    i
29ed0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
29ee0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
29ef0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
29f00 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
29f10 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
29f20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
29f30 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
29f40 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
29f50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
29f60 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
29f70 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
29f80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
29f90 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
29fa0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29fb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
29fc0 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
29fd0 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
29fe0 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
29ff0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
2a000 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  ** It is the cal
2a010 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
2a020 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52  ity to use subjR
2a030 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f  equiresPage() to
2a040 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20   check .** that 
2a050 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71  it is really req
2a060 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c  uired before cal
2a070 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
2a080 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  on..**.** If suc
2a090 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
2a0a0 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
2a0b0 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20  ng to pPg->pgno 
2a0c0 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a  in the bitvecs.*
2a0d0 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73  * for all open s
2a0e0 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65  avepoints before
2a0f0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
2a100 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2a110 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
2a120 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
2a130 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
2a140 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  n IO.** error co
2a150 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  de if the attemp
2a160 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
2a170 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61  e sub-journal fa
2a180 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49  ils, or .** SQLI
2a190 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
2a1a0 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65  lloc fails while
2a1b0 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69   setting a bit i
2a1c0 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  n a savepoint.**
2a1d0 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74   bitvec..*/.stat
2a1e0 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
2a1f0 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  lPage(PgHdr *pPg
2a200 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2a210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
2a220 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2a230 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
2a240 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2a250 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
2a260 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20  MODE_OFF ){..   
2a270 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
2a280 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
2a290 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
2a2a0 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  been opened */. 
2a2b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a2c0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
2a2d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
2a2e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2a2f0 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28   || pagerUseWal(
2a300 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61  pPager) );.    a
2a310 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2a320 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70  ager->sjfd) || p
2a330 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d  Pager->nSubRec==
2a340 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2a350 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2a360 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ger) .         |
2a370 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  | pageInJournal(
2a380 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
2a390 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
2a3a0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
2a3b0 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2a3c0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2a3d0 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
2a3e0 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
2a3f0 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
2a400 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
2a410 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
2a420 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
2a430 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
2a440 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
2a450 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2a460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a470 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
2a480 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2a490 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2a4a0 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
2a4b0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
2a4c0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
2a4d0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2a4e0 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
2a4f0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
2a500 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
2a510 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2a520 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2a530 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2a540 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
2a550 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2a560 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2a570 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
2a580 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2a590 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
2a5a0 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
2a5b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2a5c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a5d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a5e0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2a5f0 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
2a600 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2a610 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
2a620 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2a630 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a640 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2a650 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
2a660 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2a670 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
2a680 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
2a690 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2a6a0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2a6b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a6c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2a6d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2a6e0 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
2a6f0 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
2a700 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
2a710 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
2a720 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
2a730 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
2a740 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
2a750 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
2a760 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
2a770 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
2a780 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
2a790 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
2a7a0 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
2a7b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2a7c0 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
2a7d0 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
2a7e0 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
2a7f0 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
2a800 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
2a810 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
2a820 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
2a830 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2a840 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
2a850 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
2a860 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
2a870 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
2a880 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
2a890 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
2a8a0 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
2a8b0 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
2a8c0 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
2a8d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
2a8e0 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
2a8f0 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
2a900 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
2a910 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
2a920 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
2a930 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2a940 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
2a950 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
2a960 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2a970 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2a980 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2a990 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
2a9a0 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
2a9b0 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
2a9c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2a9d0 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
2a9e0 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
2a9f0 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
2aa00 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
2aa10 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
2aa20 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2aa30 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2aa40 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
2aa50 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
2aa60 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
2aa70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2aa80 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
2aa90 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
2aaa0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2aab0 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
2aac0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2aad0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
2aae0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
2aaf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2ab00 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
2ab10 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
2ab20 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53  e doNotSpill NOS
2ab30 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64  YNC bit is set d
2ab40 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e  uring times when
2ab50 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66   doing a sync of
2ab60 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  .  ** journal (a
2ab70 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20  nd adding a new 
2ab80 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61  header) is not a
2ab90 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63  llowed.  This oc
2aba0 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
2abb0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
2abc0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68  3PagerWrite() wh
2abd0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f  ile trying to jo
2abe0 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20  urnal multiple. 
2abf0 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67   ** pages belong
2ac00 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ing to the same 
2ac10 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  sector..  **.  *
2ac20 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
2ac30 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46   ROLLBACK and OF
2ac40 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20  F bits inhibits 
2ac50 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69  all cache spilli
2ac60 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65  ng.  ** regardle
2ac70 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
2ac80 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72   not a sync is r
2ac90 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69  equired.  This i
2aca0 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a  s set during.  *
2acb0 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  * a rollback or 
2acc0 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c  by user request,
2acd0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
2ace0 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e   **.  ** Spillin
2acf0 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62  g is also prohib
2ad00 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20  ited when in an 
2ad10 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63  error state sinc
2ad20 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a  e that could.  *
2ad30 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  * lead to databa
2ad40 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
2ad50 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
2ad60 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69 74  implementaton it
2ad70 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73   .  ** is imposs
2ad80 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ible for sqlite3
2ad90 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f  PcacheFetch() to
2ada0 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
2adb0 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20 20  createFlag==1.  
2adc0 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  ** while in the 
2add0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e  error state, hen
2ade0 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  ce it is impossi
2adf0 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
2ae00 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20  tine to.  ** be 
2ae10 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72  called in the er
2ae20 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65  ror state.  Neve
2ae30 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63  rtheless, we inc
2ae40 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20  lude a NEVER(). 
2ae50 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65   ** test for the
2ae60 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20   error state as 
2ae70 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69  a safeguard agai
2ae80 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67  nst future chang
2ae90 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  es..  */.  if( N
2aea0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
2aeb0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53  Code) ) return S
2aec0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74  QLITE_OK;.  test
2aed0 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2aee0 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2aef0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  FLAG_ROLLBACK );
2af00 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2af10 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2af20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20  & SPILLFLAG_OFF 
2af30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2af40 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2af50 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  l & SPILLFLAG_NO
2af60 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50  SYNC );.  if( pP
2af70 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2af80 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d  .   && ((pPager-
2af90 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53  >doNotSpill & (S
2afa0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2afb0 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29  K|SPILLFLAG_OFF)
2afc0 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70  )!=0.      || (p
2afd0 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
2afe0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29  R_NEED_SYNC)!=0)
2aff0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2b000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2b010 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
2b020 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55   0;.  if( pagerU
2b030 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
2b040 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  .    /* Write a 
2b050 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72  single frame for
2b060 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68   this page to th
2b070 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66  e log. */.    if
2b080 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
2b090 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20  ge(pPg) ){ .    
2b0a0 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
2b0b0 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20  lPage(pPg); .   
2b0c0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2b0d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b0e0 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46    rc = pagerWalF
2b0f0 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50  rames(pPager, pP
2b100 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  g, 0, 0);.    }.
2b110 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
2b120 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
2b130 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
2b140 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
2b150 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2b160 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20  R_NEED_SYNC .   
2b170 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
2b180 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
2b190 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29  R_CACHEMOD.    )
2b1a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
2b1b0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
2b1c0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   1);.    }.  .  
2b1d0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
2b1e0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20   number of this 
2b1f0 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74  page is larger t
2b200 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
2b210 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  size of.    ** t
2b220 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2b230 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74  e, it may need t
2b240 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  o be written to 
2b250 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
2b260 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
2b270 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
2b280 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f   to pager_write_
2b290 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77  pagelist() below
2b2a0 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a   will not.    **
2b2b0 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20   actually write 
2b2c0 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
2b2d0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
2b2e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e     **.    ** Con
2b2f0 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
2b300 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
2b310 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20  events:.    **. 
2b320 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20     **   BEGIN;. 
2b330 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e     **     <journ
2b340 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  al page X>.    *
2b350 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61  *     <modify pa
2b360 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
2b370 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20   SAVEPOINT sp;. 
2b380 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72     **       <shr
2b390 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ink database fil
2b3a0 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20  e to Y pages>.  
2b3b0 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
2b3c0 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
2b3d0 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41     **     ROLLBA
2b3e0 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a  CK TO sp;.    **
2b3f0 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29  .    ** If (X>Y)
2b400 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65  , then when page
2b410 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65  rStress is calle
2b420 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f  d page X will no
2b430 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20  t be written.   
2b440 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64   ** out to the d
2b450 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75  atabase file, bu
2b460 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  t will be droppe
2b470 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
2b480 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66  . Then,.    ** f
2b490 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f  ollowing the "RO
2b4a0 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74  LLBACK TO sp" st
2b4b0 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67  atement, reading
2b4c0 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61   page X will rea
2b4d0 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72  d.    ** data fr
2b4e0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2b4f0 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  file. This will 
2b500 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70  be the copy of p
2b510 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20  age X as it.    
2b520 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  ** was when the 
2b530 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
2b540 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77  ted, not as it w
2b550 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49  as when "SAVEPOI
2b560 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61  NT sp".    ** wa
2b570 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  s executed..    
2b580 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
2b590 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69  lution is to wri
2b5a0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  te the current d
2b5b0 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69  ata for page X i
2b5c0 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
2b5d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
2b5e0 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e   now (if it is n
2b5f0 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65  ot already there
2b600 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ), so that it wi
2b610 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73  ll.    ** be res
2b620 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72  tored to its cur
2b630 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20  rent value when 
2b640 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
2b650 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20   sp" is .    ** 
2b660 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f  executed..    */
2b670 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a  .    if( NEVER(.
2b680 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
2b690 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67  TE_OK && pPg->pg
2b6a0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
2b6b0 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65  e && subjRequire
2b6c0 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29  sPage(pPg).    )
2b6d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2b6e0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
2b6f0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  g);.    }.  .   
2b700 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
2b710 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2b720 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
2b730 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2b740 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b750 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2b760 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
2b770 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2b780 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
2b790 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2b7a0 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
2b7b0 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  , pPg);.    }.  
2b7c0 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
2b7d0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
2b7e0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2b7f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
2b800 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
2b810 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
2b820 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2b830 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2b840 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2b850 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
2b860 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
2b870 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
2b880 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  , rc); .}.../*.*
2b890 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2b8a0 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2b8b0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2b8c0 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2b8d0 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2b8e0 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2b8f0 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2b900 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2b910 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2b920 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2b930 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2b940 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2b950 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2b960 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b970 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2b980 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2b990 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2b9a0 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2b9b0 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2b9c0 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2b9d0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2b9e0 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2b9f0 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2ba00 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2ba10 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2ba20 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2ba30 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2ba40 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2ba50 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2ba60 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2ba70 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2ba80 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2ba90 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2baa0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2bab0 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2bac0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2bad0 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2bae0 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2baf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2bb00 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2bb10 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2bb20 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2bb30 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2bb40 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2bb50 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2bb60 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2bb70 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2bb80 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
2bb90 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
2bba0 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
2bbb0 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
2bbc0 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
2bbd0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
2bbe0 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
2bbf0 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
2bc00 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
2bc10 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
2bc20 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  ER_* flags..**.*
2bc30 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
2bc40 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
2bc50 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
2bc60 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2bc70 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
2bc80 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
2bc90 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
2bca0 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
2bcb0 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
2bcc0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2bcd0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2bce0 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
2bcf0 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
2bd00 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
2bd10 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2bd20 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
2bd30 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2bd40 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
2bd50 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
2bd60 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2bd70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
2bd80 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
2bd90 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
2bda0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2bdb0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2bdc0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
2bdd0 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
2bde0 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
2bdf0 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
2be00 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
2be10 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
2be20 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
2be30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2be40 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
2be50 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2be60 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2be70 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2be80 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2be90 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2bea0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2beb0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2bec0 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2bed0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2bee0 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2bef0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2bf00 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2bf10 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2bf20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2bf30 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2bf40 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2bf50 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2bf60 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2bf70 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2bf80 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2bf90 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2bfa0 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2bfb0 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2bfc0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2bfd0 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2bfe0 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2bff0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2c000 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2c010 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2c020 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2c030 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2c040 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2c050 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2c060 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2c070 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2c080 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2c090 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2c0a0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2c0b0 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2c0c0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2c0d0 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2c0e0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2c0f0 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2c100 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2c110 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2c120 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2c130 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
2c140 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2c150 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2c160 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2c170 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2c180 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2c190 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2c1a0 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2c1b0 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2c1c0 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2c1d0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2c1e0 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2c1f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2c200 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2c210 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c220 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2c230 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2c240 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2c250 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2c260 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2c270 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2c280 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70  urnal */.  int p
2c290 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
2c2a0 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
2c2b0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2c2c0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2c2d0 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20  PCache */.  u32 
2c2e0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2c2f0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2c300 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
2c310 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
2c320 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
2c330 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52  ri = 0;    /* UR
2c340 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a  I args to copy *
2c350 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30  /.  int nUri = 0
2c360 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2c370 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2c380 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a  of URI args at *
2c390 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  zUri */..  /* Fi
2c3a0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
2c3b0 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
2c3c0 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
2c3d0 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
2c3e0 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
2c3f0 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
2c400 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
2c410 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
2c420 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
2c430 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
2c440 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
2c450 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
2c460 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2c470 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
2c480 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
2c490 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
2c4a0 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
2c4b0 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
2c4c0 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
2c4d0 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
2c4e0 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
2c4f0 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
2c500 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
2c510 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
2c520 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
2c530 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2c540 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
2c550 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
2c560 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
2c570 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
2c580 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
2c590 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
2c5a0 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
2c5b0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2c5c0 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
2c5d0 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2c5e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c5f0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2c600 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2c610 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
2c620 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
2c630 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
2c640 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
2c650 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
2c660 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
2c670 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65  ger = 0;..#ifnde
2c680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
2c690 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61  MORYDB.  if( fla
2c6a0 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52  gs & PAGER_MEMOR
2c6b0 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d  Y ){.    memDb =
2c6c0 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c   1;.    if( zFil
2c6d0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2c6e0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  me[0] ){.      z
2c6f0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c700 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46  e3DbStrDup(0, zF
2c710 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2c720 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2c730 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54    ) return SQLIT
2c740 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e  E_NOMEM;.      n
2c750 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c760 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2c770 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69  name);.      zFi
2c780 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  lename = 0;.    
2c790 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2c7a0 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
2c7b0 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
2c7c0 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
2c7d0 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
2c7e0 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
2c7f0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
2c800 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
2c810 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
2c820 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
2c830 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
2c840 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
2c850 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
2c860 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2c870 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2c880 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e  me[0] ){.    con
2c890 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
2c8a0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
2c8b0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2c8c0 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2c8d0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
2c8e0 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a  aw(0, nPathname*
2c8f0 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  2);.    if( zPat
2c900 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  hname==0 ){.    
2c910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c920 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
2c930 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
2c940 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
2c950 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
2c960 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
2c970 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
2c980 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
2c990 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
2c9a0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
2c9b0 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
2c9c0 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  );.    nPathname
2c9d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2c9e0 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2c9f0 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a     z = zUri = &z
2ca00 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33  Filename[sqlite3
2ca10 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
2ca20 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c  me)+1];.    whil
2ca30 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a  e( *z ){.      z
2ca40 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2ca50 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20  n30(z)+1;.      
2ca60 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2ca70 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d  en30(z)+1;.    }
2ca80 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74  .    nUri = (int
2ca90 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b  )(&z[1] - zUri);
2caa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72  .    assert( nUr
2cab0 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
2cac0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2cad0 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2cae0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2caf0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2cb00 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2cb10 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2cb20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2cb30 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2cb40 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2cb50 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2cb60 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2cb70 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2cb80 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2cb90 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2cba0 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2cbb0 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2cbc0 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2cbd0 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2cbe0 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2cbf0 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2cc00 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2cc10 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2cc20 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2cc30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2cc40 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2cc50 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2cc60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2cc70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cc80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2cc90 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2cca0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ccb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
2ccc0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
2ccd0 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
2cce0 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
2ccf0 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
2cd00 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
2cd10 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
2cd20 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
2cd30 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
2cd40 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
2cd50 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
2cd60 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
2cd70 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2cd80 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
2cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cda0 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
2cdb0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2cdc0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cde0 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
2cdf0 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
2ce00 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2ce10 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2ce20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
2ce30 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
2ce40 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
2ce50 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2ce60 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2ce70 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2ce80 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
2ce90 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2cea0 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2ceb0 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2cec0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2ced0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2cee0 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2cef0 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
2cf00 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
2cf10 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2cf20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
2cf30 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
2cf40 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
2cf50 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2cf60 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
2cf70 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
2cf80 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
2cf90 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
2cfa0 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2cfb0 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
2cfc0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
2cfd0 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
2cfe0 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
2cff0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2d000 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
2d010 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
2d020 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
2d030 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
2d040 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
2d050 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2d060 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  Uri +         /*
2d070 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
2d080 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
2d090 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20  + 2             
2d0a0 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
2d0b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d0c0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50  MIT_WAL.    + nP
2d0d0 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20  athname + 4 + 2 
2d0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57             /* zW
2d0f0 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29  al */.#endif.  )
2d100 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2d110 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2d120 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
2d130 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
2d140 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
2d150 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
2d160 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2d170 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
2d180 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d190 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
2d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
2d1b0 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
2d1c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
2d1d0 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
2d1e0 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
2d1f0 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
2d200 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
2d210 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d220 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2d230 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
2d240 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
2d250 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d260 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
2d270 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
2d280 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
2d290 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d2a0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2d2b0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
2d2c0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
2d2d0 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
2d2e0 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2d2f0 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
2d300 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2d310 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
2d320 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
2d330 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
2d340 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
2d350 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
2d360 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
2d370 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
2d380 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
2d390 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b  ( nPathname>0 );
2d3a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
2d3b0 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
2d3c0 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
2d3d0 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b  ame + 1 + nUri);
2d3e0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2d3f0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
2d400 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2d410 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55  ame);.    if( nU
2d420 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61  ri ) memcpy(&pPa
2d430 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
2d440 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72  Pathname+1], zUr
2d450 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65  i, nUri);.    me
2d460 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
2d470 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  urnal, zPathname
2d480 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2d490 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2d4a0 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
2d4b0 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  name], "-journal
2d4c0 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20  \000", 8+2);.   
2d4d0 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2d4e0 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2d4f0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2d500 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65  Journal);.#ifnde
2d510 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2d520 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57  L.    pPager->zW
2d530 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a  al = &pPager->zJ
2d540 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2d550 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  +8+1];.    memcp
2d560 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  y(pPager->zWal, 
2d570 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2d580 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2d590 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b  y(&pPager->zWal[
2d5a0 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61  nPathname], "-wa
2d5b0 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20  l\000", 4+1);.  
2d5c0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2d5d0 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2d5e0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2d5f0 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  zWal);.#endif.  
2d600 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d610 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2d620 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66   }.  pPager->pVf
2d630 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67  s = pVfs;.  pPag
2d640 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
2d650 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f  fsFlags;..  /* O
2d660 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
2d670 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  le..  */.  if( z
2d680 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2d690 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2d6a0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20  int fout = 0;   
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6c0 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65   /* VFS flags re
2d6d0 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28  turned by xOpen(
2d6e0 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ) */.    rc = sq
2d6f0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
2d700 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2d710 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
2d720 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74   vfsFlags, &fout
2d730 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2d740 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61  memDb );.    rea
2d750 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
2d760 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2d770 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
2d780 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
2d790 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
2d7a0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
2d7b0 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
2d7c0 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
2d7d0 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
2d7e0 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
2d7f0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
2d800 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
2d810 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2d820 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
2d830 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
2d840 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
2d850 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d860 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
2d870 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
2d880 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
2d890 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
2d8a0 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
2d8b0 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
2d8c0 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
2d8d0 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
2d8e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2d8f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
2d900 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
2d910 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2d920 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
2d930 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
2d940 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=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 29 3b 0a 20 20  T_PAGE_SIZE);.  
2d970 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
2d980 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
2d990 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
2d9a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
2d9b0 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
2d9c0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2d9d0 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
2d9e0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
2d9f0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2da00 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
2da10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2da20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2da30 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
2da40 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
2da50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
2da60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2da70 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2da80 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2da90 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
2daa0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2dab0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2dac0 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >fd);.        in
2dad0 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73  t ii;.        as
2dae0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2daf0 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
2db00 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
2db10 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2db20 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
2db30 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
2db40 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2db50 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2db60 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
2db70 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
2db80 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
2db90 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2dba0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
2dbb0 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
2dbc0 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
2dbd0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
2dbe0 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
2dbf0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2dc00 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
2dc10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2dc20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2dc30 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2dc40 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
2dc50 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
2dc60 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
2dc70 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
2dc80 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
2dc90 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
2dca0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
2dcb0 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
2dcc0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
2dcd0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
2dce0 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
2dcf0 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
2dd00 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
2dd10 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
2dd20 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
2dd30 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2dd40 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
2dd50 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
2dd60 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
2dd70 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
2dd80 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
2dd90 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
2dda0 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
2ddb0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
2ddc0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
2ddd0 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
2dde0 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
2ddf0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2de00 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20  GER_READER;.    
2de10 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
2de20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
2de30 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2de40 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
2de50 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2de60 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
2de70 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20  llowing call to 
2de80 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2de90 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74  () serves to set
2dea0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20   the value of . 
2deb0 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   ** Pager.pageSi
2dec0 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61  ze and to alloca
2ded0 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d  te the Pager.pTm
2dee0 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
2def0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2df00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2df10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
2df20 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72  emDb==0 );.    r
2df30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2df40 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
2df50 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c  er, &szPageDflt,
2df60 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
2df70 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
2df80 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  K );.  }..  /* I
2df90 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2dfa0 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
2dfb0 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
2dfc0 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a  e, free the .  *
2dfd0 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
2dfe0 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
2dff0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2e000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e010 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
2e020 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
2e030 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   );.    sqlite3O
2e040 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
2e050 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
2e060 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
2e070 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2e080 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
2e090 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a  e the PCache obj
2e0a0 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ect. */.  assert
2e0b0 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b  ( nExtra<1000 );
2e0c0 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e  .  nExtra = ROUN
2e0d0 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71  D8(nExtra);.  sq
2e0e0 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28  lite3PcacheOpen(
2e0f0 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74  szPageDflt, nExt
2e100 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20  ra, !memDb,.    
2e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e120 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65  !memDb?pagerStre
2e130 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50  ss:0, (void *)pP
2e140 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50  ager, pPager->pP
2e150 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52  Cache);..  PAGER
2e160 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
2e170 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
2e180 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
2e190 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2e1a0 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
2e1b0 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
2e1c0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2e1d0 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
2e1e0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2e1f0 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
2e200 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nal;.  /* pPager
2e210 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
2e220 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e230 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
2e240 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2e250 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Ref = 0; */.  /*
2e260 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
2e270 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2e280 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
2e290 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e2a0 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
2e2b0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
2e2c0 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
2e2d0 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
2e2e0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
2e2f0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
2e300 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
2e310 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2e320 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f  e == (tempFile ?
2e330 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
2e340 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29   : PAGER_UNLOCK)
2e350 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20   );.#endif.  /* 
2e360 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
2e370 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2e380 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38  ->tempFile = (u8
2e390 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73  )tempFile;.  ass
2e3a0 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
2e3b0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2e3c0 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
2e3d0 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
2e3e0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e3f0 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
2e400 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2e410 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2e420 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
2e430 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2e440 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  de = (u8)tempFil
2e450 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  e; .  pPager->ch
2e460 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2e470 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e480 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
2e490 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
2e4a0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
2e4b0 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
2e4c0 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  ;.  assert( useJ
2e4d0 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
2e4e0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
2e4f0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
2e500 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e510 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
2e520 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
2e530 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
2e540 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  ullSync==0 );.  
2e550 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e560 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ->syncFlags==0 )
2e570 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2e580 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
2e590 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2e5a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70  ert( pPager->ckp
2e5b0 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  tSyncFlags==0 );
2e5c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
2e5d0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
2e5e0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2e5f0 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
2e600 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
2e610 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
2e620 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2e630 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20  E_SYNC_NORMAL | 
2e640 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
2e650 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65  TIONS;.    pPage
2e660 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2e670 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2e680 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
2e690 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
2e6a0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e6b0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
2e6c0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e6d0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
2e6e0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
2e6f0 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74  xtra = (u16)nExt
2e700 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
2e710 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
2e720 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2e730 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
2e740 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  IT;.  assert( is
2e750 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2e760 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a   || tempFile );.
2e770 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2e780 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
2e790 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
2e7a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2e7b0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2e7c0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20  URNALMODE_OFF;. 
2e7d0 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62   }else if( memDb
2e7e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2e7f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2e800 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2e810 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a  MEMORY;.  }.  /*
2e820 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
2e830 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
2e840 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
2e850 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20  HandlerArg = 0; 
2e860 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  */.  pPager->xRe
2e870 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
2e880 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  ;.  /* memset(pP
2e890 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
2e8a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
2e8b0 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20  Hash)); */.  /* 
2e8c0 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
2e8d0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2e8e0 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c  MMAP_SIZE // wil
2e8f0 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65  l be set by btre
2e900 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  e.c */..  *ppPag
2e910 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
2e920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e930 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
2e940 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
2e950 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
2e960 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61   deleted or rena
2e970 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  med out from.** 
2e980 75 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e  under the pager.
2e990 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2e9a0 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61  OK if the databa
2e9b0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65  se is still were
2e9c0 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20   it ought.** to 
2e9d0 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74  be on disk.  Ret
2e9e0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51  urn non-zero (SQ
2e9f0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
2ea00 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74  MOVED or some ot
2ea10 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  her error.** cod
2ea20 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73  e from sqlite3Os
2ea30 41 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65  Access()) if the
2ea40 20 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f   database has go
2ea50 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73  ne missing..*/.s
2ea60 74 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61  tatic int databa
2ea70 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65  seIsUnmoved(Page
2ea80 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2ea90 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b  t bHasMoved = 0;
2eaa0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
2eab0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
2eac0 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
2ead0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
2eae0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29  ger->dbSize==0 )
2eaf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2eb00 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
2eb10 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26  ger->zFilename &
2eb20 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  & pPager->zFilen
2eb30 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d  ame[0] );.  rc =
2eb40 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
2eb50 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
2eb60 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48  , SQLITE_FCNTL_H
2eb70 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d  AS_MOVED, &bHasM
2eb80 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  oved);.  if( rc=
2eb90 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
2eba0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2ebb0 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65  e HAS_MOVED file
2ebc0 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d  -control is unim
2ebd0 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d  plemented, assum
2ebe0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a  e that the file.
2ebf0 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
2ec00 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74  een moved.  That
2ec10 20 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63   is the historic
2ec20 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53  al behavior of S
2ec30 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a  QLite: prior to.
2ec40 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
2ec50 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63  .8.3, it never c
2ec60 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63  hecked */.    rc
2ec70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2ec80 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2ec90 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d  LITE_OK && bHasM
2eca0 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  oved ){.    rc =
2ecb0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2ecc0 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20  _DBMOVED;.  }.  
2ecd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2ece0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ecf0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
2ed00 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
2ed10 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
2ed20 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
2ed30 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
2ed40 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
2ed50 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2ed60 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
2ed70 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2ed80 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
2ed90 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
2eda0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
2edb0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2edc0 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
2edd0 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
2ede0 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
2edf0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
2ee00 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
2ee10 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
2ee20 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
2ee30 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ee40 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
2ee50 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
2ee60 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
2ee70 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2ee80 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2ee90 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2eea0 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
2eeb0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
2eec0 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
2eed0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
2eee0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
2eef0 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
2ef00 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
2ef10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2ef20 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
2ef30 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
2ef40 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
2ef50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ef60 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
2ef70 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
2ef80 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
2ef90 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
2efa0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
2efb0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
2efc0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
2efd0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
2efe0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2eff0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
2f000 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
2f010 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
2f020 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2f030 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2f040 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
2f050 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2f060 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
2f070 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
2f080 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2f090 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
2f0a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2f0b0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
2f0c0 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
2f0d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2f0e0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2f0f0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
2f100 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2f110 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
2f120 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
2f130 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
2f140 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
2f150 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
2f160 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
2f170 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
2f180 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
2f190 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2f1a0 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
2f1b0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
2f1c0 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
2f1d0 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
2f1e0 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
2f1f0 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
2f200 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
2f210 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
2f220 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2f230 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2f240 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
2f250 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
2f260 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2f270 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2f280 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2f290 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2f2a0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
2f2b0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2f2c0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2f2d0 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
2f2e0 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
2f2f0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2f300 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
2f310 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
2f320 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2f330 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
2f340 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2f350 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
2f360 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
2f370 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
2f380 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
2f390 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2f3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2f3b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2f3c0 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20   exists = 1;    
2f3d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f3e0 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
2f3f0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
2f400 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65  */.  int jrnlOpe
2f410 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61  n = !!isOpen(pPa
2f420 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73  ger->jfd);..  as
2f430 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2f440 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
2f450 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2f460 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
2f470 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2f480 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2f490 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a   );..  assert( j
2f4a0 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20  rnlOpen==0 || ( 
2f4b0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2f4c0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2f4d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20  Pager->jfd) &.  
2f4e0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55    SQLITE_IOCAP_U
2f4f0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
2f500 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70  OPEN.  ));..  *p
2f510 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66  Exists = 0;.  if
2f520 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2f530 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2f540 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
2f550 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2f560 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2f570 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
2f580 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2f590 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
2f5a0 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  s ){.    int loc
2f5b0 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
2f5c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2f5d0 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c  some process hol
2f5e0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2f5f0 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61  ck */..    /* Ra
2f600 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72  ce condition her
2f610 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63  e:  Another proc
2f620 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ess might have b
2f630 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  een holding the.
2f640 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52      ** the RESER
2f650 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76  VED lock and hav
2f660 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  e a journal open
2f670 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f   at the sqlite3O
2f680 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a  sAccess() .    *
2f690 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75  * call above, bu
2f6a0 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  t then delete th
2f6b0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72  e journal and dr
2f6c0 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f  op the lock befo
2f6d0 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74  re.    ** we get
2f6e0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2f6f0 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  g sqlite3OsCheck
2f700 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63  ReservedLock() c
2f710 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20  all.  If that.  
2f720 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65    ** is the case
2f730 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
2f740 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65  ight think there
2f750 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2f760 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  l when.    ** in
2f770 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e   fact there is n
2f780 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c  one.  This resul
2f790 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f  ts in a false-po
2f7a0 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c  sitive which wil
2f7b0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  l.    ** be deal
2f7c0 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c  t with by the pl
2f7d0 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20  ayback routine. 
2f7e0 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20   Ticket #3883.. 
2f7f0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2f800 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2f810 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
2f820 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
2f830 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f840 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64  TE_OK && !locked
2f850 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
2f860 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2f870 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2f880 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
2f890 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2f8a0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65      /* Check the
2f8b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2f8c0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69  abase file. If i
2f8d0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20  t consists of 0 
2f8e0 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20  pages,.      ** 
2f8f0 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
2f900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65  journal file. Se
2f910 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
2f920 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a  ment above for .
2f930 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61        ** the rea
2f940 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65  soning here.  De
2f950 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74  lete the obsolet
2f960 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75  e journal file u
2f970 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20  nder.      ** a 
2f980 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
2f990 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64   avoid race cond
2f9a0 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76  itions and to av
2f9b0 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20  oid violating.  
2f9c0 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e      ** [H33020].
2f9d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f9e0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
2f9f0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
2fa00 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2fa10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fa20 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
2fa30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2fa40 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
2fa50 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2fa60 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
2fa70 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
2fa80 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
2fa90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2faa0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2fab0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
2fac0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2fad0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2fae0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
2faf0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
2fb00 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
2fb10 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2fb20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2fb30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2fb40 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
2fb50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2fb60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2fb70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2fb80 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
2fb90 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
2fba0 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
2fbb0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
2fbc0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2fbd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2fbe0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
2fbf0 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
2fc00 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
2fc10 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
2fc20 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2fc30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2fc40 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
2fc50 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
2fc60 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
2fc70 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
2fc80 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
2fc90 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
2fca0 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
2fcb0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2fcc0 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
2fcd0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2fce0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
2fcf0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
2fd00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2fd10 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
2fd20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fd30 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2fd40 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2fd50 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
2fd60 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
2fd70 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2fd80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fd90 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
2fda0 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
2fdb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2fdc0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
2fdd0 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
2fde0 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
2fdf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2fe00 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
2fe10 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
2fe20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2fe30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2fe40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fe50 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
2fe60 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2fe70 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2fe80 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
2fe90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2fea0 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
2feb0 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
2fec0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2fed0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2fee0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
2fef0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
2ff00 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
2ff10 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2ff20 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
2ff30 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
2ff40 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61         ** its ha
2ff50 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
2ff60 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
2ff70 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
2ff80 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
2ff90 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
2ffa0 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
2ffb0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
2ffc0 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
2ffd0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
2ffe0 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
2fff0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
30000 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
30010 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
30020 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
30030 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
30040 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
30050 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
30060 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
30070 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
30080 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
30090 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
300a0 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
300b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
300c0 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
300d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
300e0 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
300f0 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
30100 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
30110 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
30120 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
30130 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30140 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
30150 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
30160 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30180 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30190 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
301a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
301b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
301c0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
301d0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
301e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
301f0 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
30200 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
30210 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
30220 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
30230 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
30240 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
30250 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
30260 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
30270 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
30280 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
30290 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
302a0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
302b0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
302c0 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
302d0 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
302e0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
302f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
30300 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
30310 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
30320 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c  OPEN state (no l
30330 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20  ock held.**     
30340 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30350 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20   file), then an 
30360 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
30370 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20  to obtain a.**  
30380 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20      SHARED lock 
30390 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
303a0 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c  file. Immediatel
303b0 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
303c0 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48  g.**      the SH
303d0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66  ARED lock, the f
303e0 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68  ile-system is ch
303f0 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d  ecked for a hot-
30400 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20  journal,.**     
30410 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64   which is played
30420 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74   back if present
30430 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20  . Following any 
30440 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  hot-journal .** 
30450 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74       rollback, t
30460 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
30470 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c  he cache are val
30480 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69  idated by checki
30490 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27  ng.**      the '
304a0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20  change-counter' 
304b0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74  field of the dat
304c0 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
304d0 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69  r and.**      di
304e0 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20  scarded if they 
304f0 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  are found to be 
30500 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20  invalid..**.**  
30510 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72   2) If the pager
30520 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
30530 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61  xclusive-mode, a
30540 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72  nd there are cur
30550 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e  rently.**      n
30560 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
30570 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20  ferences to any 
30580 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e  pages, and is in
30590 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
305a0 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61  ,.**      then a
305b0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
305c0 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65  e to clear the e
305d0 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69  rror state by di
305e0 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20  scarding.**     
305f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
30600 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
30610 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  and rolling back
30620 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   any open journa
30630 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a  l.**      file..
30640 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
30650 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
30660 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
30670 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
30680 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
30690 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
306a0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
306b0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
306c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
306d0 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62  or .** rolling b
306e0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
306f0 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  le, the IO error
30700 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
30710 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
30720 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
30730 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
30740 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30750 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
30760 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
30770 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
30780 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
30790 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
307a0 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
307b0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
307c0 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
307d0 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d  g pages. This im
307e0 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70  plies that the p
307f0 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c  ager state shoul
30800 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65  d either.  ** be
30810 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e   OPEN or READER.
30820 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20   READER is only 
30830 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
30840 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20  pager is or was 
30850 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69  in .  ** exclusi
30860 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
30870 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
30880 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
30890 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
308a0 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ache)==0 );.  as
308b0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
308c0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
308d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
308e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
308f0 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
30900 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
30910 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66  R_READER );.  if
30920 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26  ( NEVER(MEMDB &&
30930 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
30940 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67  ) ){ return pPag
30950 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a  er->errCode; }..
30960 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
30970 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
30980 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
30990 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
309a0 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  int bHotJournal 
309b0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
309c0 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
309d0 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72  xists a hot jour
309e0 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  nal-file */..   
309f0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
30a00 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  );..    rc = pag
30a10 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
30a20 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
30a30 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
30a40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30a50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
30a60 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
30a70 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  OCK || pPager->e
30a80 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
30a90 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  CK );.      goto
30aa0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a   failed;.    }..
30ab0 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
30ac0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
30ad0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
30ae0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
30af0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
30b00 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
30b10 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
30b20 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
30b30 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
30b40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
30b50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41  ager->eLock<=SHA
30b60 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
30b70 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
30b80 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48  rnal(pPager, &bH
30b90 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
30ba0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
30bb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30bc0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
30bd0 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74    }.    if( bHot
30be0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
30bf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
30c00 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
30c10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
30c20 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  DONLY_ROLLBACK;.
30c30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
30c40 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
30c50 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
30c60 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
30c70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30c80 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
30c90 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
30ca0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
30cb0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
30cc0 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
30cd0 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
30ce0 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
30cf0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
30d00 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
30d10 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
30d20 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
30d30 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
30d40 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
30d50 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
30d60 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
30d70 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
30d80 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
30d90 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
30da0 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
30db0 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
30dc0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
30dd0 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
30de0 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
30df0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
30e00 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
30e10 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
30e20 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
30e30 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
30e40 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
30e50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30e60 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
30e70 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
30e80 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
30e90 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
30ea0 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
30eb0 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
30ec0 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
30ed0 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  e file..      **
30ee0 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73  .      ** Unless
30ef0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
30f00 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
30f10 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
30f20 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20  e lock is.      
30f30 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
30f40 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66   SHARED_LOCK bef
30f50 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
30f60 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20  n returns..     
30f70 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
30f80 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
30f90 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
30fa0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
30fb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30fc0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
30fd0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  ed;.      }. .  
30fe0 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
30ff0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
31000 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78   and the file ex
31010 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70  ists on disk, op
31020 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
31030 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
31040 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
31050 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20  Write access is 
31060 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
31070 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78   .      ** in ex
31080 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
31090 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
310a0 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
310b0 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20  kept open .     
310c0 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79   ** and possibly
310d0 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
310e0 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
310f0 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63  . Also, write-ac
31100 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  cess .      ** i
31110 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72  s usually requir
31120 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ed to finalize t
31130 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f  he journal in jo
31140 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69  urnal_mode=persi
31150 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  st .      ** mod
31160 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20  e (and also for 
31170 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75  journal_mode=tru
31180 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79  ncate on some sy
31190 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a  stems)..      **
311a0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
311b0 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
311c0 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61  t exist, it usua
311d0 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73  lly means that s
311e0 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74  ome .      ** ot
311f0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
31200 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
31210 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
31220 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
31230 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  ** this connecti
31240 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  on obtained the 
31250 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61  exclusive lock a
31260 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20  bove. Or, it .  
31270 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20      ** may mean 
31280 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
31290 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  as in the error-
312a0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
312b0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
312c0 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64  n was called and
312d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
312e0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
312f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31300 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
31310 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
31320 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
31330 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
31340 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
31350 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74        int bExist
31360 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
31370 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
31380 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  al file exists *
31390 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
313a0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
313b0 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
313c0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
313d0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
313e0 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73  S_EXISTS, &bExis
313f0 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ts);.        if(
31400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
31410 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20  & bExists ){.   
31420 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
31430 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
31440 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
31450 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
31460 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
31470 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
31480 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
31490 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
314a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
314b0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
314c0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
314d0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
314e0 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
314f0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
31500 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
31510 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
31520 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
31530 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31540 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
31550 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
31560 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
31570 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
31580 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
31590 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
315a0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
315b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
315c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
315d0 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
315e0 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
315f0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
31600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
31610 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
31620 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
31630 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
31640 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
31650 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
31660 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
31670 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
31680 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
31690 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
316a0 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
316b0 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74  t cache.  Sync t
316c0 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62  he hot journal b
316d0 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20  efore playing.  
316e0 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73      ** it back s
316f0 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73  ince the process
31700 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e   that crashed an
31710 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a  d left the hot j
31720 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
31730 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74  probably did not
31740 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20   sync it and we 
31750 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
31760 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20  always sync.    
31770 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
31780 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20   before playing 
31790 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  it back..      *
317a0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  /.      if( isOp
317b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
317c0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
317d0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
317e0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
317f0 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
31800 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
31810 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31820 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31830 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
31840 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
31850 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   1);.          p
31860 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
31870 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
31880 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
31890 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
318a0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
318b0 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c          pagerUnl
318c0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
318d0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
318e0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
318f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31900 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
31910 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
31920 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
31930 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
31940 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  to open.        
31950 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20  ** or roll back 
31960 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68  a hot-journal wh
31970 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ile holding an E
31980 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
31990 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
319a0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75  ger_unlock() rou
319b0 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
319c0 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  led before retur
319d0 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20  ning to unlock. 
319e0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69         ** the fi
319f0 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63  le. If the unloc
31a00 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c  k attempt fails,
31a10 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63   then Pager.eLoc
31a20 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20  k must be.      
31a30 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e    ** set to UNKN
31a40 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68  OWN_LOCK (see th
31a50 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
31a60 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20  the #define for 
31a70 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e  .        ** UNKN
31a80 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66  OWN_LOCK above f
31a90 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
31aa0 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  n). .        **.
31ab0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72          ** In or
31ac0 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72  der to get pager
31ad0 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20  _unlock() to do 
31ae0 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e  this, set Pager.
31af0 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20  eState to.      
31b00 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
31b10 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f   now. This is no
31b20 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74  t actually count
31b30 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69  ed as a transiti
31b40 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  on.        ** to
31b50 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20   ERROR state in 
31b60 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61  the state diagra
31b70 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  m at the top of 
31b80 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20  this file,.     
31b90 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
31ba0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d  now that the sam
31bb0 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
31bc0 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65  unlock() will ve
31bd0 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68  ry.        ** sh
31be0 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e  ortly transition
31bf0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
31c00 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74  t to the OPEN st
31c10 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20  ate. Calling.   
31c20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70       ** assert_p
31c30 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75  ager_state() wou
31c40 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20  ld fail now, as 
31c50 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
31c60 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
31c70 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52    ** to be in ER
31c80 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
31c90 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75  here are zero ou
31ca0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a  tstanding page .
31cb0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72          ** refer
31cc0 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ences..        *
31cd0 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  /.        pager_
31ce0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
31cf0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
31d00 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
31d10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31d20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
31d30 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
31d40 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
31d50 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  er->eLock==SHARE
31d60 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20  D_LOCK).        
31d70 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
31d80 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
31d90 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48  pPager->eLock>SH
31da0 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
31db0 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
31dc0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
31dd0 46 69 6c 65 20 26 26 20 28 0a 20 20 20 20 20 20  File && (.      
31de0 20 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75    pPager->pBacku
31df0 70 20 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  p .     || sqlit
31e00 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
31e10 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
31e20 65 29 3e 30 20 0a 20 20 20 20 20 7c 7c 20 55 53  e)>0 .     || US
31e30 45 46 45 54 43 48 28 70 50 61 67 65 72 29 0a 20  EFETCH(pPager). 
31e40 20 20 20 29 29 7b 0a 20 20 20 20 20 20 2f 2a 20     )){.      /* 
31e50 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
31e60 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
31e70 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61  quired on the da
31e80 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20  tabase file.    
31e90 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
31ea0 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73  re already pages
31eb0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66   in the cache (f
31ec0 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20  rom a previous. 
31ed0 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
31ee0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
31ef0 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  n).  Check to se
31f00 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
31f10 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62  e.      ** has b
31f20 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
31f30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
31f40 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73  as changed, flus
31f50 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  h the.      ** c
31f60 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ache..      **. 
31f70 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65       ** Database
31f80 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65   changes is dete
31f90 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
31fa0 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
31fb0 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  nning.      ** a
31fc0 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
31fd0 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
31fe0 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
31ff0 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
32000 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
32010 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
32020 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
32030 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
32040 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  he.      ** othe
32050 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
32060 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
32070 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
32080 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  en.      ** a co
32090 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
320a0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
320b0 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
320c0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
320d0 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
320e0 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
320f0 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74  .      ** detect
32100 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
32110 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
32120 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
32130 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a  all that.      *
32140 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
32150 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ected..      */.
32160 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
32170 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
32180 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
32190 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
321a0 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20  eVers)];..      
321b0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
321c0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
321d0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
321e0 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b  c ) goto failed;
321f0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ..      if( nPag
32200 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
32210 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
32220 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
32230 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
32240 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
32250 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
32260 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
32270 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
32280 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
32290 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
322a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
322b0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
322c0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
322d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
322e0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
322f0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
32300 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
32310 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
32320 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
32330 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
32340 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67   if( memcmp(pPag
32350 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
32360 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
32370 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21  of(dbFileVers))!
32380 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  =0 ){.        pa
32390 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
323a0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  );..        /* U
323b0 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62 61 73  nmap the databas
323c0 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f  e file. It is po
323d0 73 73 69 62 6c 65 20 74 68 61 74 20 65 78 74 65  ssible that exte
323e0 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20  rnal processes. 
323f0 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61         ** may ha
32400 76 65 20 74 72 75 6e 63 61 74 65 64 20 74 68 65  ve truncated the
32410 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
32420 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64  nd then extended
32430 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20   it back.       
32440 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69   ** to its origi
32450 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74  nal size while t
32460 68 69 73 20 70 72 6f 63 65 73 73 20 77 61 73 20  his process was 
32470 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  not holding a lo
32480 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ck..        ** I
32490 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
324a0 65 20 6d 61 79 20 65 78 69 73 74 20 61 20 50 61  e may exist a Pa
324b0 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67  ger.pMap mapping
324c0 20 74 68 61 74 20 61 70 70 65 61 72 73 0a 20 20   that appears.  
324d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74        ** to be t
324e0 68 65 20 72 69 67 68 74 20 73 69 7a 65 20 62 75  he right size bu
324f0 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  t is not actuall
32500 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74  y valid. Avoid t
32510 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
32520 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e  ossibility by un
32530 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62 20 68  mapping the db h
32540 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ere. */.        
32550 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
32560 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
32570 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
32580 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
32590 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
325a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
325b0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
325c0 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20  s a WAL file in 
325d0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
325e0 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62   open this datab
325f0 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a  ase in WAL.    *
32600 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  * mode. Otherwis
32610 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
32620 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69   function call i
32630 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a  s a no-op..    *
32640 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
32650 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
32660 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65  (pPager);.#ifnde
32670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
32680 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  L.    assert( pP
32690 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c  ager->pWal==0 ||
326a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
326b0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
326c0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
326d0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
326e0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
326f0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
32700 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
32710 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
32720 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
32730 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32740 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d  AGER_OPEN && rc=
32750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32760 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
32770 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70  count(pPager, &p
32780 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
32790 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
327a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
327b0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
327c0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
327d0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
327e0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
327f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32800 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
32810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
32820 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
32830 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20  ER_READER;.  }. 
32840 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
32850 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
32860 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
32870 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
32880 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
32890 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
328a0 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
328b0 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
328c0 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
328d0 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
328e0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
328f0 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
32900 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
32910 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
32920 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
32930 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
32940 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
32950 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
32960 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
32970 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
32980 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
32990 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
329a0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
329b0 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26  r->nMmapOut==0 &
329c0 26 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  & (sqlite3Pcache
329d0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
329e0 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b  >pPCache)==0) ){
329f0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
32a00 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
32a10 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
32a20 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65  * Acquire a refe
32a30 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75  rence to page nu
32a40 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67  mber pgno in pag
32a50 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67  er pPager (a pag
32a60 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68  e.** reference h
32a70 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29  as type DbPage*)
32a80 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
32a90 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ed reference is 
32aa0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
32ab0 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73   obtained, it is
32ac0 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61   copied to *ppPa
32ad0 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
32ae0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
32af0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
32b00 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
32b10 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
32b20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
32b30 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
32b40 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
32b50 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
32b60 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
32b70 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
32b80 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
32b90 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
32ba0 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
32bb0 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
32bc0 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
32bd0 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
32be0 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
32bf0 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
32c00 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
32c10 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
32c20 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
32c30 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
32c40 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
32c50 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
32c60 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
32c70 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
32c80 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
32c90 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
32ca0 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
32cb0 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
32cc0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
32cd0 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
32ce0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
32cf0 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
32d00 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
32d10 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
32d20 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
32d30 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
32d40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
32d50 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
32d60 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
32d70 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
32d80 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
32d90 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
32da0 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
32db0 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
32dc0 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
32dd0 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
32de0 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
32df0 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
32e00 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
32e10 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
32e20 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
32e30 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
32e40 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
32e50 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
32e60 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
32e70 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
32e80 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
32e90 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
32ea0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
32eb0 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
32ec0 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
32ed0 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63  occurs in two sc
32ee0 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
32ef0 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67   a) When reading
32f00 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
32f10 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  f page from the 
32f20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a  database, and.**
32f30 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20  .**   b) When a 
32f40 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69  savepoint is bei
32f50 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  ng rolled back a
32f60 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f  nd we need to lo
32f70 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77  ad.**      a new
32f80 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63   page into the c
32f90 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65  ache to be fille
32fa0 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  d with the data 
32fb0 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
32fc0 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  m the savepoint 
32fd0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
32fe0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
32ff0 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
33000 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
33010 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66  eroed instead of
33020 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66  .** being read f
33030 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
33040 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
33050 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
33060 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
33070 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
33080 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
33090 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
330a0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
330b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
330c0 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
330d0 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
330e0 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
330f0 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
33100 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
33110 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
33120 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
33130 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
33140 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
33150 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
33160 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
33170 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
33180 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
33190 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
331a0 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
331b0 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
331c0 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
331d0 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
331e0 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
331f0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
33200 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
33210 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
33220 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
33230 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
33240 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
33250 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
33260 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
33270 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
33280 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
33290 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
332a0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
332b0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
332c0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
332d0 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
332e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
332f0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
33300 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
33310 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
33320 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
33330 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
33340 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
33350 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
33360 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
33370 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
33380 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
33390 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
333a0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
333b0 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
333c0 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
333d0 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
333e0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
333f0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
33400 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
33410 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
33420 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
33430 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
33440 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
33450 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33460 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
33470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
33480 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
33490 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
334a0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
334b0 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
334c0 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
334d0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
334e0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
334f0 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
33500 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
33510 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
33520 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75  dr *pPg = 0;.  u
33530 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20  32 iFrame = 0;  
33540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33550 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20  * Frame to read 
33560 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f  from WAL file */
33570 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43  .  const int noC
33580 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20  ontent = (flags 
33590 26 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  & PAGER_GET_NOCO
335a0 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74  NTENT);..  /* It
335b0 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74   is acceptable t
335c0 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c  o use a read-onl
335d0 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f  y (mmap) page fo
335e0 72 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70  r any page excep
335f0 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66  t.  ** page 1 if
33600 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69   there is no wri
33610 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
33620 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49  pen or the ACQUI
33630 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  RE_READONLY.  **
33640 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66   flag was specif
33650 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
33660 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61  r. And so long a
33670 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20  s the db is not 
33680 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
33690 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y or in-memory d
336a0 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
336b0 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b  onst int bMmapOk
336c0 20 3d 20 28 70 67 6e 6f 21 3d 31 20 26 26 20 55   = (pgno!=1 && U
336d0 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 0a  SEFETCH(pPager).
336e0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
336f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
33700 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DER || (flags & 
33710 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
33720 4c 59 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49  LY)).#ifdef SQLI
33730 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
33740 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  && pPager->xCode
33750 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 3b  c==0.#endif.  );
33760 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
33770 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
33780 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
33790 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
337a0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
337b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 6f   );.  assert( no
337c0 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d  Content==0 || bM
337d0 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69  mapOk==0 );..  i
337e0 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
337f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33800 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
33810 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
33820 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
33830 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
33840 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65  rn an error imme
33850 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f  diately. .  ** O
33860 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73  therwise, reques
33870 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  t the page from 
33880 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72  the PCache layer
33890 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
338a0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
338b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
338c0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
338d0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  e;.  }else{..   
338e0 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
338f0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
33900 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
33910 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
33920 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
33930 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
33940 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
33950 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
33960 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
33970 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
33980 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
33990 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  iFrame==0 ){.   
339a0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
339b0 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   0;..      rc = 
339c0 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70  sqlite3OsFetch(p
339d0 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20  Pager->fd, .    
339e0 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f        (i64)(pgno
339f0 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
33a00 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e  geSize, pPager->
33a10 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61  pageSize, &pData
33a20 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
33a30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33a40 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20  OK && pData ){. 
33a50 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
33a60 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
33a70 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20 20  READER ){.      
33a80 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
33a90 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
33aa0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
33ab0 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20  no, 0, &pPg);.  
33ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33ad0 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
33ae0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
33af0 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
33b00 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70  (pPager, pgno, p
33b10 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20  Data, &pPg);.   
33b20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
33b40 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
33b50 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
33b60 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
33b70 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  e, pData);.     
33b80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
33b90 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20   pPg ){.        
33ba0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
33bb0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
33bc0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
33bd0 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  Pg;.          re
33be0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
33bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33c00 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
33c10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33c20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
33c30 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
33c40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
33c50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
33c60 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
33c70 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31  pPCache, pgno, 1
33c80 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  , ppPage);.  }..
33c90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33ca0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  _OK ){.    /* Ei
33cb0 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f  ther the call to
33cc0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
33cd0 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61  tch() returned a
33ce0 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20  n error or the. 
33cf0 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20     ** pager was 
33d00 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
33d10 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
33d20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
33d30 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
33d40 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e   Set pPg to 0 an
33d50 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78  d jump to the ex
33d60 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e  ception handler.
33d70 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30    */.    pPg = 0
33d80 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72  ;.    goto pager
33d90 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
33da0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
33db0 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
33dc0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
33dd0 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
33de0 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70  ==pPager || (*pp
33df0 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30  Page)->pPager==0
33e00 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50   );..  if( (*ppP
33e10 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20  age)->pPager && 
33e20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  !noContent ){.  
33e30 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
33e40 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72  e the pcache alr
33e50 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  eady contains an
33e60 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70   initialized cop
33e70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  y of.    ** the 
33e80 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74  page. Return wit
33e90 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f  hout further ado
33ea0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
33eb0 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41  ( pgno<=PAGER_MA
33ec0 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d  X_PGNO && pgno!=
33ed0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
33ee0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61  ager) );.    pPa
33ef0 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
33f00 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20  _STAT_HIT]++;.  
33f10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33f20 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
33f30 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
33f40 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
33f50 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
33f60 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
33f70 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
33f80 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20  tialized.  */.. 
33f90 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
33fa0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
33fb0 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
33fc0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
33fd0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
33fe0 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
33ff0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
34000 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
34010 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
34020 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
34030 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
34040 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
34050 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
34060 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
34070 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
34080 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
34090 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
340a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
340b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
340c0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
340d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45     }..    if( ME
340e0 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  MDB || pPager->d
340f0 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f  bSize<pgno || no
34100 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70  Content || !isOp
34110 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
34120 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
34130 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
34140 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
34150 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
34160 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
34170 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34180 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
34190 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
341a0 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
341b0 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
341c0 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
341d0 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
341e0 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
341f0 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
34200 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
34210 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
34220 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
34230 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
34240 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
34250 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
34260 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
34270 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
34280 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
34290 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
342a0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
342b0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
342c0 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
342d0 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
342e0 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
342f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
34300 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
34310 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
34320 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
34330 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
34340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
34350 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
34360 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
34370 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
34380 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
34390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
343a0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
343b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
343c0 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
343d0 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
343e0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
343f0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
34400 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
34410 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
34420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
34430 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
34440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34450 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
34460 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
34470 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49  geSize);.      I
34480 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
34490 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
344a0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
344b0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61 67  e{.      if( pag
344c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
344d0 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29   && bMmapOk==0 )
344e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
344f0 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
34500 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
34510 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b   pgno, &iFrame);
34520 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
34530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
34540 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34550 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
34560 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
34570 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
34580 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
34590 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
345a0 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20  _MISS]++;.      
345b0 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
345c0 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20  pPg, iFrame);.  
345d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
345e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
345f0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34600 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
34610 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
34620 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
34630 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
34640 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
34650 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
34660 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
34670 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
34680 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
34690 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
346a0 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
346b0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
346c0 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61  Pager);..  *ppPa
346d0 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
346e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
346f0 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
34700 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
34710 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
34720 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
34730 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
34740 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
34750 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
34760 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
34770 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
34780 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a  not in cache. .*
34790 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
347a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
347b0 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
347c0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
347d0 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
347e0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
347f0 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
34800 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
34810 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
34820 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
34830 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
34840 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
34850 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
34860 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
34870 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
34880 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
34890 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
348a0 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
348b0 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
348c0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
348d0 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
348e0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
348f0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
34900 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34910 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
34920 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
34930 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34940 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20  pPCache!=0 );.  
34950 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34960 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
34970 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e  ADER && pPager->
34980 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
34990 52 4f 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ROR );.  sqlite3
349a0 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
349b0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
349c0 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72  o, 0, &pPg);.  r
349d0 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a  eturn pPg;.}../*
349e0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
349f0 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a  ge reference..**
34a00 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
34a10 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
34a20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
34a30 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
34a40 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
34a50 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
34a60 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
34a70 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
34a80 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
34a90 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
34aa0 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
34ab0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
34ac0 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
34ad0 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oved..*/.void sq
34ae0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
34af0 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70  otNull(DbPage *p
34b00 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
34b10 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
34b20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  pPg!=0 );.  pPag
34b30 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
34b40 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61  ;.  if( pPg->fla
34b50 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20  gs & PGHDR_MMAP 
34b60 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65  ){.    pagerRele
34b70 61 73 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b  aseMapPage(pPg);
34b80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
34b90 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
34ba0 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  se(pPg);.  }.  p
34bb0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
34bc0 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f  ed(pPager);.}.vo
34bd0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
34be0 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
34bf0 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 20 73  ){.  if( pPg ) s
34c00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
34c10 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a  NotNull(pPg);.}.
34c20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
34c30 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
34c40 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
34c50 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
34c60 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
34c70 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
34c80 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
34c90 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
34ca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
34cb0 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
34cc0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
34cd0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
34ce0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34cf0 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
34d00 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
34d10 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
34d20 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
34d30 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
34d40 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
34d50 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
34d60 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
34d70 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
34d80 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
34d90 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
34da0 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
34db0 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
34dc0 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
34dd0 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
34de0 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
34df0 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
34e00 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
34e10 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
34e20 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
34e30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34e40 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
34e50 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
34e60 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
34e70 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
34e80 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
34e90 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
34ea0 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
34eb0 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
34ec0 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
34ed0 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
34ee0 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
34ef0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
34f00 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
34f10 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
34f20 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
34f30 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
34f40 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
34f50 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
34f60 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
34f70 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
34f80 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
34f90 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
34fa0 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
34fb0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
34fc0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
34fd0 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
34fe0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
34ff0 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
35000 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
35010 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
35020 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
35030 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
35040 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
35050 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35070 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
35080 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
35090 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
350a0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
350b0 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
350c0 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
350d0 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
350e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
350f0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
35100 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
35110 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
35120 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
35130 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35140 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
35150 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
35160 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
35170 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
35180 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
35190 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
351a0 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
351b0 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
351c0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
351d0 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
351e0 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
351f0 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
35200 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
35210 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
35220 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
35230 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  ode;..  if( !pag
35240 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
35250 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
35260 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
35270 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
35280 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  {.    pPager->pI
35290 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
352a0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
352b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
352c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
352d0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
352e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
352f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
35300 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
35310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35320 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
35330 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
35340 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
35350 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
35360 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
35370 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
35380 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35390 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
353a0 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
353b0 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
353c0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
353d0 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  se{.        cons
353e0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
353f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35400 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
35410 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
35420 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53  e */.          S
35430 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
35440 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
35450 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
35460 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
35470 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
35480 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
35490 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
354a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
354b0 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
354c0 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
354d0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
354e0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20  .          );.. 
354f0 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
35500 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
35510 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65  se still has the
35520 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74   same name as it
35530 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20   did when.      
35540 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67    ** it was orig
35550 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a  inally opened. *
35560 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 64  /.        rc = d
35570 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64  atabaseIsUnmoved
35580 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
35590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
355a0 5f 4f 4b 20 29 7b 0a 23 69 66 64 65 66 20 53 51  _OK ){.#ifdef SQ
355b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
355c0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
355d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
355e0 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
355f0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
35600 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
35610 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
35620 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
35630 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
35640 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a         );.#else.
35650 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35660 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
35670 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
35680 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
35690 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e  , flags, 0);.#en
356a0 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
356b0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
356c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
356d0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
356e0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
356f0 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57  }.  .  .    /* W
35700 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
35710 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
35720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35730 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20  e and open .    
35740 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
35750 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
35760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
35770 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35780 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
35790 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
357a0 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
357b0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
357c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
357d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
357e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
357f0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
35800 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
35810 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
35820 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
35830 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
35840 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
35850 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
35860 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35870 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
35880 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
35890 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
358a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
358b0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
358c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
358d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
358e0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
358f0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70  _LOCKED );.    p
35900 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
35910 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
35920 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  HEMOD;.  }..  re
35930 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35940 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
35950 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
35960 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
35970 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
35980 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
35990 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
359a0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
359b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
359c0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
359d0 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
359e0 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
359f0 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
35a00 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
35a10 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
35a20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
35a30 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
35a40 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
35a50 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
35a60 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
35a70 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
35a80 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
35a90 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
35aa0 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
35ab0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
35ac0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
35ad0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
35ae0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
35af0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
35b00 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
35b10 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
35b20 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
35b30 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
35b40 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
35b50 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
35b60 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
35b70 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
35b80 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
35b90 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
35ba0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
35bb0 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
35bc0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
35bd0 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
35be0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
35bf0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
35c00 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
35c10 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
35c20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
35c30 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
35c40 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
35c50 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
35c60 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
35c70 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
35c80 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
35c90 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
35ca0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
35cb0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
35cc0 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
35cd0 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
35ce0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35cf0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
35d00 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
35d10 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
35d20 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
35d30 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
35d40 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
35d50 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
35d60 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61  R_ERROR );.  pPa
35d70 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
35d80 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
35d90 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57  mory;..  if( ALW
35da0 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61  AYS(pPager->eSta
35db0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
35dc0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
35dd0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35de0 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  nal==0 );..    i
35df0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
35e00 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
35e10 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
35e20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
35e30 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
35e40 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
35e50 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
35e60 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
35e70 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
35e80 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
35e90 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
35ea0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
35eb0 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
35ec0 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
35ed0 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
35ee0 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
35ef0 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
35f00 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
35f10 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
35f20 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
35f30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
35f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
35f70 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
35f80 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
35f90 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Wal, 1);.      }
35fa0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20  ..      /* Grab 
35fb0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
35fc0 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
35fd0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75  If successful, u
35fe0 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20  pgrade to.      
35ff0 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
36000 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  D state. Otherwi
36010 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
36020 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
36030 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
36040 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
36050 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
36060 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
36070 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
36080 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
36090 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
360a0 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75   possible, the u
360b0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
360c0 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a  call it..      *
360d0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
360e0 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
360f0 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
36100 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
36110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
36120 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  Obtain a RESERVE
36130 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
36140 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
36150 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d  the exFlag param
36160 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  eter.      ** is
36170 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
36180 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
36190 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
361a0 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
361b0 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e       ** busy-han
361c0 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61  dler callback ca
361d0 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75  n be used when u
361e0 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20  pgrading to the 
361f0 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20  EXCLUSIVE.      
36200 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74  ** lock, but not
36210 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20   when obtaining 
36220 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
36230 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
36240 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
36250 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
36260 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
36270 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36280 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a  OK && exFlag ){.
36290 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
362a0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
362b0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
362c0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
362d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
362e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
362f0 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65  .      /* Change
36300 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   to WRITER_LOCKE
36310 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  D state..      *
36320 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d  *.      ** WAL m
36330 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65  ode sets Pager.e
36340 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57  State to PAGER_W
36350 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20  RITER_LOCKED or 
36360 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a  CACHEMOD.      *
36370 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e  * when it has an
36380 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   open transactio
36390 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20  n, but never to 
363a0 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45  DBMOD or FINISHE
363b0 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  D..      ** This
363c0 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74   is because in t
363d0 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20  hose states the 
363e0 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63  code to roll bac
363f0 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  k savepoint .   
36400 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
36410 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61  ns may copy data
36420 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
36430 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64  urnal into the d
36440 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a  atabase .      *
36450 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61  * file as well a
36460 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20  s into the page 
36470 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75  cache. Which wou
36480 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20  ld be incorrect 
36490 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c  in .      ** WAL
364a0 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   mode..      */.
364b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
364c0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
364d0 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  TER_LOCKED;.    
364e0 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
364f0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
36500 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
36510 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
36520 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
36530 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36540 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
36550 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
36560 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
36570 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
36580 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
36590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
365a0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
365b0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
365c0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
365d0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
365e0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
365f0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
36600 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
36610 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
36620 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  e(pPager) );.  }
36630 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
36640 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
36650 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
36660 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  er)));.  return 
36670 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
36680 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
36690 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
366a0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
366b0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
366c0 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
366d0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
366e0 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
366f0 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
36700 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
36710 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
36720 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
36730 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
36740 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
36750 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
36760 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
36770 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
36780 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
36790 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
367a0 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
367b0 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
367c0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
367d0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
367e0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
367f0 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
36800 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
36810 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
36820 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
36830 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
36840 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  e is not called 
36850 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74  unless a write-t
36860 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
36870 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65  lready .  ** bee
36880 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a  n started. The j
36890 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
368a0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
368b0 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  en at this point
368c0 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76  ..  ** It is nev
368d0 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  er called in the
368e0 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20   ERROR state..  
368f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
36900 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36910 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
36920 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
36930 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36940 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
36950 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
36960 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36970 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
36980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
36990 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
369a0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
369b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
369c0 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Code==0 );.  ass
369d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61  ert( pPager->rea
369e0 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 43  dOnly==0 );..  C
369f0 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
36a00 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
36a10 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
36a20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65  be opened. Highe
36a30 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73  r level routines
36a40 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
36a50 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  ** obtained the 
36a60 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20  necessary locks 
36a70 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72 69  to begin the wri
36a80 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
36a90 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c  but the.  ** rol
36aa0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69  lback journal mi
36ab0 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f  ght not yet be o
36ac0 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77  pen. Open it now
36ad0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
36ae0 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
36af0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  This is done bef
36b00 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  ore calling sqli
36b10 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
36b20 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65  ty() on the page
36b30 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
36b40 65 2c 20 69 66 20 69 74 20 77 65 72 65 20 64 6f  e, if it were do
36b50 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e 67  ne after calling
36b60 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
36b70 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e 0a  keDirty(), then.
36b80 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69    ** an error mi
36b90 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74 68  ght occur and th
36ba0 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65 6e  e pager would en
36bb0 64 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f 4c  d up in WRITER_L
36bc0 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a 2a  OCKED state.  **
36bd0 20 77 69 74 68 20 70 61 67 65 73 20 6d 61 72 6b   with pages mark
36be0 65 64 20 61 73 20 64 69 72 74 79 20 69 6e 20 74  ed as dirty in t
36bf0 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  he cache..  */. 
36c00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
36c10 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
36c20 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
36c30 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
36c40 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
36c50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
36c60 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
36c70 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
36c80 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
36c90 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
36ca0 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73  ACHEMOD );.  ass
36cb0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
36cc0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
36cd0 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
36ce0 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
36cf0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
36d00 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
36d10 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
36d20 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
36d30 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
36d40 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
36d50 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
36d60 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
36d70 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  if( pageInJourna
36d80 6c 28 70 50 67 29 20 26 26 20 28 70 50 61 67 65  l(pPg) && (pPage
36d90 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
36da0 20 7c 7c 20 21 73 75 62 6a 52 65 71 75 69 72 65   || !subjRequire
36db0 73 50 61 67 65 28 70 50 67 29 29 20 29 7b 0a 20  sPage(pPg)) ){. 
36dc0 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
36dd0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
36de0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20  );.  }else{.  . 
36df0 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
36e00 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
36e10 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
36e20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
36e30 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
36e40 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
36e50 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
36e60 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
36e70 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
36e80 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
36e90 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
36ea0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
36eb0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
36ec0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67   */.    if( !pag
36ed0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
36ee0 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
36ef0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
36f00 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
36f10 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
36f20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
36f30 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
36f40 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73  dbOrigSize && is
36f50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
36f60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  ) ){.        u32
36f70 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
36f80 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20  char *pData2;.  
36f90 20 20 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d        i64 iOff =
36fa0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36fb0 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  Off;..        /*
36fc0 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
36fd0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
36fe0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
36ff0 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
37000 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
37010 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
37020 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
37030 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
37040 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
37050 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
37060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
37070 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
37080 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
37090 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
370a0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
370b0 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a  alHdr<=pPager->j
370c0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
370d0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
370e0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
370f0 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
37100 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
37110 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ata2);.        c
37120 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
37130 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
37140 70 44 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20  pData2);..      
37150 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20    /* Even if an 
37160 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65  IO or diskfull e
37170 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
37180 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68  e journalling th
37190 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
371a0 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  e in the block a
371b0 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65  bove, set the ne
371c0 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72  ed-sync flag for
371d0 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20   the page..     
371e0 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
371f0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
37200 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
37210 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20  back, the logic 
37220 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c  in.        ** pl
37230 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
37240 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61  ) will think tha
37250 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
37260 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a   to be restored.
37270 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
37280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
37290 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72   And if an IO er
372a0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
372b0 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20   doing so,.     
372c0 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75     ** then corru
372d0 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77  ption may follow
372e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
372f0 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
37300 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
37310 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20  NC;..        rc 
37320 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
37330 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c  ager->jfd, iOff,
37340 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
37350 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
37360 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
37370 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
37380 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
37390 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
373a0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
373b0 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a  eSize, iOff+4);.
373c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
373d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
373e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72  rn rc;.        r
373f0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
37400 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
37410 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  f+pPager->pageSi
37420 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  ze+4, cksum);.  
37430 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37440 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
37450 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f   rc;..        IO
37460 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
37470 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
37480 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
37490 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
374a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
374b0 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  nalOff, pPager->
374c0 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  pageSize));.    
374d0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
374e0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
374f0 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  tej_count);.    
37500 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
37510 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
37520 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
37530 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
37540 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
37550 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
37560 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
37570 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
37580 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
37590 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
375a0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
375b0 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ..        pPager
375c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
375d0 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  8 + pPager->page
375e0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50  Size;.        pP
375f0 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
37600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
37610 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37620 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
37630 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
37640 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
37650 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
37660 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
37670 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
37680 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
37690 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
376a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
376b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
376c0 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64          rc |= ad
376d0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
376e0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
376f0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
37700 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37710 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
37720 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
37730 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
37740 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
37750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
37770 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
37780 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
37790 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20  DBMOD ){.       
377a0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
377b0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
377c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
377d0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
377e0 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
377f0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
37800 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
37810 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
37820 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
37830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
37840 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
37850 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
37860 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
37870 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
37880 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
37890 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
378a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
378b0 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
378c0 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
378d0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
378e0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
378f0 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
37900 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
37910 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
37920 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
37930 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
37940 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
37950 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
37960 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
37970 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
37980 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
37990 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
379a0 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20  ge(pPg) ){.     
379b0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
379c0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
379d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
379e0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
379f0 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
37a00 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
37a10 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70  r->dbSize<pPg->p
37a20 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
37a30 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
37a40 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74  >pgno;.  }.  ret
37a50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37a60 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
37a70 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
37a80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
37a90 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
37aa0 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68  re .** making ch
37ab0 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
37ac0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
37ad0 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
37ae0 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74  n value .** of t
37af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
37b00 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
37b10 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  to change any pa
37b20 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a  ge data unless .
37b30 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
37b40 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
37b50 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  K..**.** The dif
37b60 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
37b70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
37b80 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  d pager_write() 
37b90 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
37ba0 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65  function also de
37bb0 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65  als with the spe
37bc0 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  cial case where 
37bd0 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a  2 or more pages.
37be0 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ** fit on a sing
37bf0 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
37c00 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
37c10 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67   co-resident pag
37c20 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  es.** must have 
37c30 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
37c40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37c50 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
37c60 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
37c70 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
37c80 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20  ITE_NOMEM or an 
37c90 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
37ca0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20   returned.** as 
37cb0 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68  appropriate. Oth
37cc0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
37cd0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
37ce0 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61  3PagerWrite(DbPa
37cf0 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
37d00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
37d10 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50  OK;..  PgHdr *pP
37d20 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
37d30 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
37d40 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61  Pg->pPager;..  a
37d50 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
37d60 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 29  gs & PGHDR_MMAP)
37d70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
37d80 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
37d90 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
37da0 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CKED );.  assert
37db0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37dc0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
37dd0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
37de0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
37df0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
37e00 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
37e10 7a 65 20 3e 20 28 75 33 32 29 70 50 61 67 65 72  ze > (u32)pPager
37e20 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
37e30 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
37e40 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
37e50 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
37e60 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
37e70 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
37e80 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
37e90 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
37ea0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
37eb0 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
37ec0 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
37ed0 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20   nPage = 0;     
37ee0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
37ef0 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
37f00 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
37f10 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
37f20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
37f30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
37f40 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
37f50 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
37f60 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
37f70 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
37f80 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
37f90 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  /.    Pgno nPage
37fa0 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
37fb0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
37fc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
37fd0 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  );..    /* Set t
37fe0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
37ff0 53 59 4e 43 20 62 69 74 20 74 6f 20 31 2e 20 54  SYNC bit to 1. T
38000 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
38010 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20  e cannot allow. 
38020 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20     ** a journal 
38030 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
38040 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
38050 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
38060 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   by.    ** this 
38070 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  function..    */
38080 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
38090 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MDB );.    asser
380a0 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
380b0 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
380c0 41 47 5f 4e 4f 53 59 4e 43 29 3d 3d 30 20 29 3b  AG_NOSYNC)==0 );
380d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
380e0 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c  otSpill |= SPILL
380f0 46 4c 41 47 5f 4e 4f 53 59 4e 43 3b 0a 0a 20 20  FLAG_NOSYNC;..  
38100 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
38110 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
38120 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
38130 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
38140 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
38150 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
38160 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
38170 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
38180 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
38190 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
381a0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
381b0 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
381c0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
381d0 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
381e0 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
381f0 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
38200 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d      nPageCount =
38210 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
38220 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
38230 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
38240 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
38250 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
38260 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
38270 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
38280 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
38290 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
382a0 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
382b0 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
382c0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
382d0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
382e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
382f0 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
38300 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
38310 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
38320 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
38330 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
38340 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
38350 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
38360 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
38370 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
38380 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
38390 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
383a0 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
383b0 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
383c0 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
383d0 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
383e0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
383f0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
38400 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
38410 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
38420 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
38430 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
38440 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
38450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
38460 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
38470 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
38480 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
38490 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
384a0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
384b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
384c0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
384d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
384e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
384f0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
38500 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
38510 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
38520 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
38530 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
38540 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29  kup(pPager, pg))
38550 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
38560 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
38570 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
38580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
38590 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
385a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
385b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
385c0 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 20 20  tNull(pPage);.  
385d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
385e0 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52   /* If the PGHDR
385f0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
38600 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f  is set for any o
38610 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65  f the nPage page
38620 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  s .    ** starti
38630 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20  ng at pg1, then 
38640 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
38650 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  et for all of th
38660 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20  em. Because.    
38670 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  ** writing to an
38680 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65  y of these nPage
38690 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67   pages may damag
386a0 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68  e the others, th
386b0 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
386c0 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61   file must conta
386d0 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69  in sync()ed copi
386e0 65 73 20 6f 66 20 61 6c